OSX上的不同libjpeg動態庫之間存在動態鏈接衝突。首先有一個標準的原生libJPEG.dylib(在/System/Library/Frameworks/ImageIO.framework/Versions/A/Resources/中)。但是,如果您使用的是MacPorts,則(在/ opt/local/lib中)也可以有一個與端口相關的libjpeg.dylib。後者可能已經被安裝爲其他端口的依賴項。OSX中動態鏈接優先級之間的衝突?
這會產生一個問題,當您鏈接到您的系統libJPEG(這是首選)。 那麼如果/opt/local/lib
是DYLD_LIBRARY_PATH,這條道路將尋找一個動態的lib時,導致運行錯誤加載符號時優先:
dyld: Symbol not found: __cg_jpeg_resync_to_restart
Referenced from:
/System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
Expected in: /opt/local/lib/libJPEG.dylib
in /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO
Trace/BPT trap: 5
所以我有兩個問題(可能是相關的):
什麼是解決實際問題的好方法(從
DYLD_LIBRARY_PATH
中刪除/opt/local/lib
明顯解決了這個問題,但爲其他依賴造成問題)?還有哪些其他路徑被搜索到動態庫(即,指定了「/ System/Library」路徑)以及爲什麼DYLD_LIBRARY_PATH的優先級更高?
謝謝你的回覆。 'otool'和'install_name_tool'確實很有用。爲什麼我在鏈接時不使用完整路徑的原因是因爲二進制文件將分發到沒有brew或端口的系統。我想盡可能地使用系統庫,其餘庫將與應用程序打包在一起。但在開發過程中,目錄結構看起來與已安裝應用程序的目錄結構不同,因此我將非系統庫鏈接到相對路徑(如要分發的版本中),但在/ DYLD中有/ opt/local /,直到我準備好發佈/包裝。 – kamjagin
但似乎正確的做法是儘量避免DYLD_LIBRARY_PATH。 – kamjagin
我也爲Mac開發需要特定樹結構的系統可執行文件。我使用的解決方案有兩個:我使用Xcode中的'INSTALL_PATH','DSTROOT'和'DEPLOYMENT_LOCATION',將其安裝到一棵看起來像我最終樹的樹中。對於依賴於相對路徑的任何東西('@ executable_path'),這就夠了。對於需要絕對路徑的東西,我在我的「真正的」安裝路徑中的我的開發盒上有一個符號鏈接到我的Xcode DSTROOT。 –