9

我有一个 Python 扩展模块,它需要在运行时链接到一些动态库,所以我需要告诉它在哪里寻找它们。我通过在 setup.py 中指定 runtime_library_dirs 来做到这一点。这在 Linux 上运行良好,但似乎对 Mac 没有影响。当我尝试导入我的模块时,我得到一个 ImportError,我发现让它消失的唯一方法是在启动 python 之前将库目录添加到 DYLD_LIBRARY_PATH。我需要做什么才能完成这项工作?

4

2 回答 2

11

我终于想通了。解决方案有两个部分。首先,setup.py 需要使用 extra_link_args 告诉链接器为编译的模块添加正确的 rpath:

if platform.system() == 'Darwin':
    extra_link_args.append('-Wl,-rpath,'+lib_path)

其中 lib_path 是安装库的目录。其次,您链接的所有库都必须具有以“@rpath/”开头的安装名称。例如,如果一个库名为“libFoo.dylib”,则其安装名称应为“@rpath/libFoo.dylib”。您可以使用“install_name_tool -id”来更改库的安装名称。

于 2013-10-02T21:27:52.673 回答
1

您可以告诉扩展链接与哪些库

otool -L pyext.so

我遇到了一个问题,即扩展程序链接到我系统上错误版本的库。在那种情况下,我使用 install_name_tool 直接更改库的路径。例如,

install_name_tool -change /wrong/libfoo.dylib /right/libfoo.dylib pyext.so
于 2014-06-10T01:17:43.273 回答