我有一个Python扩展模块,需要在运行时链接到一些动态库,因此我需要告诉它在哪里寻找它们。我通过在setup.py中指定runtime_library_dirs来做到这一点。这在Linux上可以正常工作,但在Mac上似乎没有任何作用。当我尝试导入模块时,我收到一个ImportError,而我发现使其消失的唯一方法是在启动python之前将库目录添加到DYLD_LIBRARY_PATH中。我需要做些什么才能使这项工作?
最佳答案
我终于想通了。该解决方案包括两个部分。首先,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”来更改库的安装名称。
关于Python runtime_library_dirs在Mac上不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19123623/