Python runtime_library_dirs在Mac上不起作用

时间:2013-10-01 18:46:53

标签: python macos shared-libraries distutils

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

2 个答案:

答案 0 :(得分:8)

我终于弄明白了。解决方案有两个部分。首先,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”来更改库的安装名称。

答案 1 :(得分:0)

您可以通过

告诉扩展程序链接哪些库
otool -L pyext.so

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

install_name_tool -change /wrong/libfoo.dylib /right/libfoo.dylib pyext.so