2013-07-14 61 views
10

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 

所以我有兩個問題(可能是相關的):

  1. 什麼是解決實際問題的好方法(從DYLD_LIBRARY_PATH中刪除/opt/local/lib明顯解決了這個問題,但爲其他依賴造成問題)?

  2. 還有哪些其他路徑被搜索到動態庫(即,指定了「/ System/Library」路徑)以及爲什麼DYLD_LIBRARY_PATH的優先級更高?

回答

8

您不應該使用DYLD_LIBRARY_PATH設置庫路徑。正如你發現的那樣,這種情況往往會發生。在鏈接時,可執行文件和庫應該有他們的庫需求。使用otool -L找出該文件尋找:

$ otool -L /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO 
/System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO: 
    /System/Library/Frameworks/ImageIO.framework/Versions/A/ImageIO (compatibility version 1.0.0, current version 1.0.0) 
    ... 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1) 

對於我的自制建項目之一的例子:

$ otool -L /usr/local/bin/gifcolor 
/usr/local/bin/gifcolor: 
    /usr/local/Cellar/giflib/4.1.6/lib/libgif.4.dylib (compatibility version 6.0.0, current version 6.6.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0) 

注意,它引用/usr/local。如果您已經構建它以引用錯誤的庫,我建議重建並將其指向正確的庫。

如果這是不可能的,可以使用install_name_tool來編輯使用哪條路徑,但有些情況下這不起作用,比如新路徑比舊路徑長,而且沒有鏈接它與-header_pad_max_install_names。重建正確的路徑是首選。

請注意,有一些「特殊」路徑可用於允許相對於其加載程序找到庫。請參閱@executable_path/及其親屬dyld(1)手冊頁。

+0

謝謝你的回覆。 'otool'和'install_name_tool'確實很有用。爲什麼我在鏈接時不使用完整路徑的原因是因爲二進制文件將分發到沒有brew或端口的系統。我想盡可能地使用系統庫,其餘庫將與應用程序打包在一起。但在開發過程中,目錄結構看起來與已安裝應用程序的目錄結構不同,因此我將非系統庫鏈接到相對路徑(如要分發的版本中),但在/ DYLD中有/ opt/local /,直到我準備好發佈/包裝。 – kamjagin

+1

但似乎正確的做法是儘量避免DYLD_LIBRARY_PATH。 – kamjagin

+1

我也爲Mac開發需要特定樹結構的系統可執行文件。我使用的解決方案有兩個:我使用Xcode中的'INSTALL_PATH','DSTROOT'和'DEPLOYMENT_LOCATION',將其安裝到一棵看起來像我最終樹的樹中。對於依賴於相對路徑的任何東西('@ executable_path'),這就夠了。對於需要絕對路徑的東西,我在我的「真正的」安裝路徑中的我的開發盒上有一個符號鏈接到我的Xcode DSTROOT。 –

1

我有一個類似的錯誤,我解決了把下面的變量在我的.bash_profile:

export DYLD_LIBRARY_PATH=/usr/lib/:$DYLD_LIBRARY_PATH 
25

我遇到過類似的問題,而在MacOS上埃爾卡皮坦使用OpenCV的。解決使用中link

解決方案解決問題是要刪除的/ usr/local/lib目錄目錄中的一些dlylibs和創建符號鏈接到相關的文件/System/Library/Frameworks/ImageIO.framework/Resources/

cd /usr/local/lib 
rm libgif.dylib 
ln -s /System/Library/Frameworks/ImageIO.framework/Resources/libGIF.dylib libGIF.dylib 
rm libjpeg.dylib 
ln -s /System/Library/Frameworks/ImageIO.framework/Resources/libJPEG.dylib libJPEG.dylib 
rm libtiff.dylib 
ln -s /System/Library/Frameworks/ImageIO.framework/Resources/libTIFF.dylib libTIFF.dylib 
rm libpng.dylib 
ln -s /System/Library/Frameworks/ImageIO.framework/Resources/libPng.dylib libPng.dylib 
+1

拯救生命!!!!非常感謝。順便說一句,在我的系統中,沒有libgif.dylib要刪除。 –

+0

哇。這工作!非常感謝! – Mauker

+0

謝謝! 'libgif'在我的系統上。 – kilojoules

0

我按照mdemirst的建議,並解決了我的問題。我正在使用OS X Sierra。

我創造了一個要點,以防別人遇到同樣的問題。

Gist to fix Spidermonkey errors

3

我試圖在MacOS塞拉利昂 運行Apache Celix如果使用自制安裝的libjpeg,填實libtiff,其中的libpng可能混淆使用MacOS的ImageIO的庫鏈接器時也有類似的錯誤。簡單的解決方法是取消鏈接那些庫:

brew unlink libpng 
brew unlink libtiff 
brew unlink libjpeg 

重新鏈接這些庫,每當我們需要:

brew link libpng 
brew link libtiff 
brew link libjpeg 
+0

我在使用Qt創建器時遇到了這個問題。以上是一個很好的解決方案,很容易逆轉。如果你還有libgif的問題,你還需要'brew unlink giflib'。 –