Python运行库dirs不';我不能在Mac上工作

Python运行库dirs不';我不能在Mac上工作,python,macos,shared-libraries,distutils,Python,Macos,Shared Libraries,Distutils,我有一个Python扩展模块,需要在运行时链接到一些动态库,所以我需要告诉它在哪里查找它们。我是通过在setup.py中指定runtime\u library\u dirs来实现的。这在Linux上运行良好,但在Mac上似乎没有效果。当我尝试导入模块时,我遇到了一个ImportError,我发现唯一能让它消失的方法是在启动python之前将库目录添加到DYLD_library_路径。我需要做些什么才能让这一切顺利进行?我终于明白了。解决方案分为两部分。首先,setup.py需要使用额外的链接参数

我有一个Python扩展模块,需要在运行时链接到一些动态库,所以我需要告诉它在哪里查找它们。我是通过在setup.py中指定runtime\u library\u dirs来实现的。这在Linux上运行良好,但在Mac上似乎没有效果。当我尝试导入模块时,我遇到了一个ImportError,我发现唯一能让它消失的方法是在启动python之前将库目录添加到DYLD_library_路径。我需要做些什么才能让这一切顺利进行?

我终于明白了。解决方案分为两部分。首先,setup.py需要使用额外的链接参数来告诉链接器向编译模块添加正确的rpath:

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

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

您可以知道扩展链接所针对的库

otool -L pyext.so
我遇到了一个问题,扩展程序链接到了我系统上错误版本的库。在这种情况下,我使用install_name_工具直接更改库的路径。比如说,

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

你能发布你的setup.py吗?我跟踪了您添加到setup.py中的内容,然后手动运行“install_name_tool-id@rpath/libfoo.so myfile.so”,但它似乎没有改变任何东西……实际上已经解决了这个问题。事实上,在构建链接所针对的库时,可以将-install_name@rpath/添加到链接器中。事实上,在我自己的软件包中测试这一点时,我发现在mac上,runtime_library_dirs只是在linker命令中添加了一个额外的-L标志,这看起来很奇怪,因为library_dirs就是这么做的。在Linux上,它会修改rpath,因为它应该修改。install_name_tool-change对我不起作用,但是
install_name_tool-id@rpath/libfoo.so/path/to/actual/libfoo/libfoo.so
成功了。