【问题标题】:Linking to a dynamic library on a Mac with full path使用完整路径链接到 Mac 上的动态库
【发布时间】:2010-12-28 13:51:31
【问题描述】:

我正在使用以下命令(使用 cmake 生成)链接嵌入 Matlab 引擎的(Python 扩展)库

c++ -mmacosx-version-min=10.6 -bundle -headerpad_max_install_names  -o library.so library.o /Applications/MATLAB_R2009b.app/bin/maci64/libeng.dylib /Applications/MATLAB_R2009b.app/bin/maci64/libmx.dylib -framework Python

导致

$ otool -L library.so
library.so:
    @loader_path/libeng.dylib (compatibility version 0.0.0, current version 0.0.0)
    @loader_path/libmx.dylib (compatibility version 0.0.0, current version 0.0.0)
    /System/Library/Frameworks/Python.framework/Versions/2.6/Python (compatibility version 2.6.0, current version 2.6.1)
    /opt/local/lib/gcc44/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.13.0)
    /opt/local/lib/gcc44/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.0)

但是,当我尝试使用该库时,我收到一条错误消息:

ImportError: dlopen(./library.so, 2): Library not loaded: @loader_path/libmex.dylib
  Referenced from: ./library.so
  Reason: image not found

我认为问题源于链接器包含@loader_path/libeng.dylib 形式的matlab dylib 文件而不是使用完整路径,即使我提供了g++ 的完整路径。如何强制链接器使用完整路径?

我知道一种解决方案是使用

export DYLD_LIBRARY_PATH=/Applications/MATLAB_R2009b.app/bin/maci64:$DYLD_LIBRARY_PATH

这是那些库文件所在的位置,但我想避免这种情况,因为它会导致一些其他问题。

【问题讨论】:

标签: macos linker dylib


【解决方案1】:

查看 ld 命令的 -rpath 选项来控制它。您可能还对https://github.com/bimargulies/jni-origin-testbed的内容感兴趣,这是一些相关技术的演示。

这里的关键技术是:

install_name_tool -change libsl2.so "@loader_path/libsl2.so" libsl1.so

【讨论】:

  • 您能详细说明一下吗?我有同样的问题。我觉得我构建的项目中的一些路径没有找到正确的位置!
【解决方案2】:

使用install_name_tool手动更改文件

install_name_tool -change "@loader_path/libeng.dylib" "/Applications/MATLAB_R2009b.app/bin/maci64/libeng.dylib" library.so 
install_name_tool -change "@loader_path/libmx.dylib" "/Applications/MATLAB_R2009b.app/bin/maci64/libmx.dylib" library.so 

我可以将其用作临时修复,但我想知道是否没有更好的解决方案,其中链接器被设置为使用完整路径。

【讨论】:

  • 这很有用,但你是对的,在 CMake 中应该有这样做的方法
  • 我最终需要做逆运算;用涉及@loader_path 的路径替换绝对路径。 dyld man page 有助于解释 dyld 的行为,因为它涉及绝对路径和 @loader_path 的扩展。
【解决方案3】:

你也可以使用符号链接!

【讨论】:

    【解决方案4】:

    请注意,DYLD_LIBRARY_PATH 的一些问题可以通过使用DYLD_FALLBACK_LIBRARY_PATH 来避免。只有在默认路径中找不到 lib 时才会使用此选项。

    【讨论】:

    • 使用这个只是打破了我所在的外壳,并给了我:```python dyld:未加载库:@loader_path/../lib/libpython2.7.dylib 引用自:.. ./bin/python 原因:找不到图像 Trace/BPT 陷阱:5 ```
    猜你喜欢
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 2017-11-06
    • 2013-07-03
    • 2021-12-16
    相关资源
    最近更新 更多