Cythonized 扩展库依赖不正确

Cythonized extension library dependency is incorrect

在 Cython 生成的 *.so 文件上使用 ldd 检查依赖项,依赖项包含 myLib.o 而不是 libforcython.o

我不明白为什么它试图达到 myLib.o 而不是 libforcython,如我的 setup.py 中所示。

在 python 执行模块期间产生类似于 Cython unable to find shared object file 的错误。然而,与包含的链接和答案相反,我的问题似乎并没有发生在 python 初始化期间,而是发生在 cythonization 本身期间。


使用这些文件:

example.pyx :

cdef extern from "myLib.h":
    void testFunction ()

setup.py:

from distutils.core import setup 
from distutils.extension import Extension
from Cython.Build import cythonize


pythoncallsc_extension = Extension (
    name = "pythoncallsc",
    sources=["./example.pyx"],
    libraries=["forcython"])

setup ( name = "pythoncallsc",
        ext_modules = cythonize ([pythoncallsc_extension]))

当我查看 python3 setup.py build_ext --inplace 生成的日志时,我可以在命令行中清楚地看到启动 gcc,它包含:

... -lforcython -lpython3.7m ...

很明显 gcc 正在链接我的库 libforcython。 该库包含:

这个库是在我系统的其他地方单独构建的。我检查了 include 和 lib,它们显然在我的 cython 项目的 $PATH 中。


cythonization 生成库 pythoncallsc.cpython-37m-x86_64-linux-gnu.so

但出乎我意料的是:

ldd pythoncallsc.cpython-37m-x86_64-linux-gnu.so

linux-vdso.so.1 (0x00007ffee40fb000)
myLib.o => not found                     <=== HERE ???
libpython3.7m.so.1.0 => /path/to/lib...
libpthread.so.0 => ...
libc.so.6 => ...
...

为什么 cython 产生的输出取决于 myLib.o 文件而不是 libforcython.so

这个 myLib.o 文件不存在,因此在我启动我的模块时会产生错误:

`ImportError: myLib.o: cannot open shared object file: No such file or directory`

有什么线索吗?

如果出现此错误,我们应该检查 c 库是如何构建的。

如评论中所述,libforcython 库未正确构建。

它是在 Makefile 中使用 soname 和 gcc 错误构建的。

正确:

gcc myLib.o -shared -fPIC -Wl,-soname,libforcython.so -o libforcython.so -lc

不正确:

gcc -shared -fPIC -Wl,-soname,myLib.o -o libforcython.so myLib.o -lc

在这种情况下,soname 并不是很有用,因为我没有为库使用版本号:一个更简单的用例。