Cython构建导致未定义的symb

2024-05-23 19:49:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个c++程序,我正试图包装/转换成Cython。它使用的特定库由于某些原因不会导致导入工作模块。顺便说一下,有一个正在工作的c++程序。这是setup.py:

ext_modules = [
Extension(
    name="libnmfpy",
    sources=["interface/nmf_lib.pyx"],
    include_dirs = ["../src/", numpy.get_include()],
    libraries=["nmf","mpi_cxx","mpi","m"],
    library_dirs=["../build/Linux/bin.release","/usr/local/lib/","/usr/lib"],
    language="c++",)
]

setup(
name = 'libnmfpy',
cmdclass = {'build_ext': build_ext},
ext_modules = ext_modules,
)

我应该提到的是libnmf似乎引起了问题。libnmf的第一次生成将导致此脚本生成此错误:

/usr/bin/ld: ../build/Linux/bin.release/libnmf.a(nmf.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
../build/Linux/bin.release/libnmf.a: could not read symbols: Bad value
collect2: error: ld returned 1 exit status

当我用-fPIC重建libnmf时,安装程序会生成libnmfpy.so,但是当我在另一个脚本中导入它时,我会得到前面提到的未定义符号:

Traceback (most recent call last):
File "test.py", line 1, in <module>
    import libnmfpy
ImportError: $path/cython/libnmfpy.so: undefined symbol: _ZN4elem6lapack3SVDEiiPdiS1_

如果有帮助的话,我的搜索建议如下:

nm libnmfpy.so | grep _ZN4elem6lapack3SVDEiiPdiS1_
             U _ZN4elem6lapack3SVDEiiPdiS1_

nm ../build/Linux/bin.release/libnmf.a | grep _ZN4elem6lapack3SVDEiiPdiS1_
             U _ZN4elem6lapack3SVDEiiPdiS1_

这就是我对错误原因的猜测。我看了看libnmf所建立的令人不快的库:

nm $another_path/lib/libelemental.a | grep _ZN4elem6lapack3SVDEiiPdiS1_
0000000000005290 T _ZN4elem6lapack3SVDEiiPdiS1_

我还不太熟悉图书馆和链接器,所以任何帮助将不胜感激。谢谢

编辑:一点点的挖掘让我意识到了一些事情。MacOSX和Linux之间有什么区别我应该注意吗?我为之工作的人写这篇文章的最初报告没有像这样的构建错误


Tags: buildmodulesreleasebinsolinuxlibusr
2条回答

你应该使用nm -C,来解开你的符号。看起来您还混合了静态库和共享库,这通常不是一个好主意。另外,gcc的链接器是一个一次通过的链接器,这意味着库标志的顺序很重要。您要按相反的依赖关系顺序列出库。换句话说,如果a依赖于b,那么b必须出现在链接器标志中的a之前。

我不能尝试重新创建你的设置,然后在我的设置上测试解决方案,因为我没有你的源代码,但在我看来,当你用fpic重新编译libnmf时,它是用动态链接重新编译的,而以前它是静态链接的。

如果我的猜测是正确的,那么你可以尝试:

  1. 使用-fPIC-static再次编译libnmf。
  2. 更改setup.py-将"elemental"添加到libraries列表-这也将使链接器获取该库。

您应该注意到,方法1通常被认为不太可取,但正如我所说,它可能最初是以这种方式编译的。#但是,2可能需要更多的工作,因为如果需要其他lib,您还必须找到并添加它们。

相关问题 更多 >