使用完整路径链接到Mac上的动态库

dzh*_*lil 20 macos linker dylib

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

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
Run Code Online (Sandbox Code Playgroud)

导致

$ 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)
Run Code Online (Sandbox Code Playgroud)

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

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

我相信这个问题源于链接器包含表单中的matlab dylib文件@loader_path/libeng.dylib而不是使用完整路径这一事实,即使我给出了完整路径g++.如何强制链接器使用完整路径?

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

export DYLD_LIBRARY_PATH=/Applications/MATLAB_R2009b.app/bin/maci64:$DYLD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)

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

dzh*_*lil 30

使用手动更改文件 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 
Run Code Online (Sandbox Code Playgroud)

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

  • 这很有用,但你是对的,应该有一种在CMake中这样做的方法 (2认同)

qua*_*gar 7

请注意,DYLD_LIBRARY_PATH可以通过使用DYLD_FALLBACK_LIBRARY_PATH替代来防止某些问题.仅当在默认路径中找不到lib时才会使用此选项.


bma*_*ies 5

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

这里的关键技术是:

install_name_tool -change libsl2.so "@loader_path/libsl2.so" libsl1.so
Run Code Online (Sandbox Code Playgroud)