【问题标题】:Python runtime_library_dirs doesn't work on MacPython runtime_library_dirs 在 Mac 上不起作用
【发布时间】:2013-10-08 01:14:45
【问题描述】:

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

【问题讨论】:

    标签: python macos shared-libraries distutils


    【解决方案1】:

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

    【讨论】:

    • 你能发布你的 setup.py 吗?我按照您对 setup.py 的添加,然后手动运行“install_name_tool -id @rpath/libfoo.so myfile.so”,但它似乎没有改变任何东西......
    • 其实想通了。事实上,当您构建要链接的库时,您可以将 -install_name @rpath/ 添加到链接器。这样您以后不必更改它。
    • 确实...为我自己的包测试这个我发现在 mac 上,runtime_library_dirs 只是在链接器命令中添加了一个额外的 -L 标志,这似乎很奇怪,因为这就是 library_dirs 应该做的.在 Linux 上,它会根据需要修改 rpath。
    【解决方案2】:

    您可以知道扩展链接到哪些库

    otool -L pyext.so
    

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

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

    【讨论】:

    • install_name_tool -change 对我不起作用,但 install_name_tool -id @rpath/libfoo.so /path/to/actual/libfoo/libfoo.so 成功了。
    猜你喜欢
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    相关资源
    最近更新 更多