构建python C ++扩展 - 如何知道是否找不到链接库

时间:2014-09-19 21:12:12

标签: python distutils python-extensions

我下载了一个python包装的C ++代码,并尝试从源代码构建它,它编译时没有错误,但是当我运行最终结果时,它失败的方式似乎表明它至少找不到它本应链接的一个库。

让我感到惊讶的是,在distutils.core.Extension中,您可以提供一个库列表,但没有错误或消息告诉我其中一个库不存在。我可以在列表中放置任何乱码字符串,它仍然可以正常运行。在Extension中是否有任何设置?还是以其他方式检查?

供参考,这里是setup.py代码(Ubuntu 14.04,Python 2.7):

coolmodule = Extension('cool',
    sources = [
        'cool/main_python.c'
    ],
    libraries = [
        'cool',
        'stdc++'
        'lapack',
        'blas',
        'gfortran',
        'fftw3',
        # if I add any gibberish string to this list,
        # it still runs without error!
    ],
    library_dirs = ['./build'],
    extra_link_args = [
        './build/libcool.a'
    ]
)

setup(name = 'cool',
    ext_modules = [coolmodule]
)

提前谢谢!!

1 个答案:

答案 0 :(得分:0)

您是否正在创建作为Python模块导入的共享库?如果是这样,您可以使用Linux / Unix中的ldd实用程序来查看模块所需的共享库。在Mac OS X上,等效工具为otool -L

(test)MacBook-Air-2:foo talumbau$ otool -L foo_ext.so
foo_ext.so:
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
        /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 2577.0.0)

如果共享库需要其他库但未找到它们,lddotool -L将显示哪些库。然后,您可以跟踪它们并修改LD_LIBRARY_PATH,以便在加载时将它们链接起来。