2009-12-20 226 views
18

我連接一個(Python擴展)庫嵌入用下面的命令Matlab引擎造成鏈接到動態庫Mac上與完整路徑

$ 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) 

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 

(使用cmake生成)

然而,當我嘗試使用圖書館,我得到一個錯誤信息:

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 

這也正是這些庫文件存在,但我想,以避免因爲它會導致一些其他問題。

+0

:請參考以下鏈接 [Add_libray] [1] [1]我的回答:http://stackoverflow.com/questions/4876740/xcode-keeps-searching-dylib-at-wrong-路徑/ 19245310#19245310 – itechnician 2013-10-08 10:35:53

回答

29

使用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 

我可以用這個作爲一個臨時的解決辦法手動更改的文件,但我不知道如果沒有更好的解決辦法鏈接器被賦予使用完整路徑的設置。

+2

這是有用的,但你是對的,應該有這樣做的CMake – eqzx 2013-03-07 16:25:08

+0

我最終需要做相反的操作;替換一個涉及'@ loader_path'的絕對路徑。 [dyld man page](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/dyld.1.html)有助於解釋dyld的行爲,因爲它涉及絕對路徑和'@ loader_path'的擴展。 – nornagon 2016-01-06 23:15:20

5

查看ld命令的-rpath選項來控制此選項。您也可能對https://github.com/bimargulies/jni-origin-testbed的內容感興趣,這是一些相關技術的演示。這裏

的關鍵技術是:

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

你能詳細解釋一下嗎?我有同樣的問題。我覺得我建立的項目中的一些路徑並未找到正確的位置! – Yasin 2015-07-19 14:22:45

-2

您還可以使用符號鏈接!

+1

您是否閱讀過其他答案並理解問題? – 2015-10-16 08:54:21

6

請注意,DYLD_LIBRARY_PATH的某些問題可以通過使用DYLD_FALLBACK_LIBRARY_PATH來避免。只有在缺省路徑中找不到lib時纔會使用此選項。

+0

使用這個只是打破了我的殼,並給了我: ''' python dyld:庫未加載:@loader_path /../ lib/libpython2.7.dylib 引用自:.../bin/python 原因是:image not found Trace/BPT trap:5 ''' – 2015-12-24 10:46:18