我的Rust项目使用了对C库SuperLU的FFI,它被称为superlu-sys.我的Ruust代码生成了与Py03的绑定.一旦Python绑定有一个调用SuperLU的函数,我就会在构建时收到以下链接器错误:

relocation R_X86_64_PC32 against symbol `stderr@@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC

这很奇怪,因为-fPIC是由构建来执行的.超级lu-sys的RS:

run!(cmd!("make")
    .current_dir(&source.join("SRC"))
    .arg("NOOPTS=-O0 -fPIC -w")
    .arg("CFLAGS=-O3 -DNDEBUG -DPRNTlevel=0 -fPIC -w")
    .arg("DZAUX=")
    .arg("SCAUX=")
    .arg(&format!("SuperLUroot={}", source.display()))
    .arg(&format!(
        "SUPERLULIB={}",
        lib.join("libsuperlu.a").display()
    )));

这是全部的build.rs美元.

在给出一个最小的例子后,我发现只要在构建SuperLu的同一个箱子里有Py03绑定,它就可以工作.我的印象是,只有当它是 crate 树的根时,才会给出对Build.rs旗帜的坚持.

如何修改构建.RS以获得-fPIC的一致实施?

这是导致该问题的最小示例: Lib.rs:

use pyo3::prelude::*;
use std::os::raw::c_int;
use superlu_sys;

#[pyclass]
pub struct Object {}

#[pymethods]
impl Object {
    pub fn test(&self) -> i32 {
        unsafe {
            *superlu_sys::intMalloc(1 as c_int)
        }
    }
}

#[allow(unused)]
#[pymodule]
fn bind_superlu(py: Python, m: &PyModule) -> PyResult<()> {
    m.add_class::<Object>()?;
    Ok(())
}

货运量:

[package]
name = "bind_superlu"
version = "0.1.0"
edition = "2021"

[lib]
name = "ress"
crate-type = ["cdylib"]

[dependencies]
superlu-sys = "0.3.4"
pyo3 = {version = "0.18.1", features = ["auto-initialize"]}

推荐答案

我将buid.ars脚本切换为使用cmake rust机箱,而不是调用make作为子进程.

Python相关问答推荐

在使用Guouti包的Python中运行MPP模型时内存不足

如何在图片中找到这个化学测试条?OpenCV精明边缘检测不会绘制边界框

从webhook中的短代码(而不是电话号码)接收Twilio消息

Django管理面板显示字段最大长度而不是字段名称

海运图:调整行和列标签

Excel图表-使用openpyxl更改水平轴与Y轴相交的位置(Python)

发生异常:TclMessage命令名称无效.!listbox"

Telethon加入私有频道

DataFrames与NaN的条件乘法

python中字符串的条件替换

根据列值添加时区

如何启动下载并在不击中磁盘的情况下呈现响应?

如何在TensorFlow中分类多个类

查看pandas字符列是否在字符串列中

当HTTP 201响应包含 Big Data 的POST请求时,应该是什么?  

如果不使用. to_list()[0],我如何从一个pandas DataFrame中获取一个值?

read_csv分隔符正在创建无关的空列

Pandas:计数器的滚动和,复位

高效地计算数字数组中三行上三个点之间的Angular

我怎样才能让深度测试在OpenGL中使用Python和PyGame呢?