Cythonized 扩展库依赖不正确

ldd在 Cython 生成的 *.so 文件上检查依赖项,依赖项包含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。该库包含:


头文件 myLib.h

为函数生成了 libforcython.so 文件void testFunction(void)。

这个库是在我系统的其他地方单独构建的。我检查了 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`

任何线索?


宝慕林4294392
浏览 108回答 1
1回答

手掌心

如果出现此错误,我们应该检查 c 库是如何构建的。正如评论中所建议的,该libforcython库未正确构建。它是soname在 Makefile 中使用 gcc 错误地构建的。正确的:gcc&nbsp;myLib.o&nbsp;-shared&nbsp;-fPIC&nbsp;-Wl,-soname,libforcython.so&nbsp;-o&nbsp;libforcython.so&nbsp;-lc不正确:gcc&nbsp;-shared&nbsp;-fPIC&nbsp;-Wl,-soname,myLib.o&nbsp;-o&nbsp;libforcython.so&nbsp;myLib.o&nbsp;-lc在这种情况下,soname 并不是很有用,因为我没有为库使用版本号:一个更简单的用例。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python