2010-04-11 69 views
11

我使用的是Mac OS X 10.6 SDK,我的部署目標設置爲Mac OS 10.5。我鏈接到libcrypto(AquaticPrime需要這個),並發現我的應用程序無法在Leopard上啓動。該錯誤是鏈接到libcrypto for Leopard?

dyld: Library not loaded: /usr/lib/libcrypto.0.9.8.dylib

我嘗試以下解決方法,但他們沒有工作:

  • 直接鏈接到libcrypto.0.9.7.dylib(10.6 SDK拒絕直接與libcrypto.0.9.7.dylib鏈接
  • 複製。 10.5 SDK的版本libcrypto.0.9.7.dylib到10.6 lib目錄,並嘗試鏈接它(這次鏈接過程成功,但在Leopard中,應用程序仍嘗試查找不存在的libcrypto.0.9.8.dylib文件,因此不會啓動)
  • 從Mac OS X 10.5.8安裝中複製libcrypto.0.9.7.dylib並與其鏈接(鏈接成功,但該應用程序仍在尋找libcrypto.0.9.8.dylib)。

有沒有辦法鏈接到這個庫,仍然使用10.6 SDK?

謝謝。

+0

描述你如何鏈接到圖書館。我和其他人一樣使用它,所以無論是你的安裝有問題,或者你的鏈接不正確。 – 2010-04-11 13:30:54

回答

1

您可以嘗試在目標構建設置中將基礎SDK設置爲10.5。

+0

是的..這一個工作。我將基礎SDK設置爲10.5,但將活動SDK設置爲10.6。這樣我就有10.6個源代碼(例如實現10.6協議的代碼),並且仍然能夠在10.5中運行該應用程序。 謝謝。 – adib 2010-04-15 17:30:31

+0

現在,在XCode 3.2.3中刪除了「Active SDK」選項,我應該如何處理這個問題? – adib 2010-06-30 14:29:12

+0

你現在的選擇有限。發生該問題的原因是10.6 SDK中有一個libcrypto版本,與10.5中的版本不兼容。通過將基礎SDK設置爲10.5,您說它是您要使用的最大SDK版本。從技術上講,你不應該使用10.6頭文件。 – JeremyP 2010-06-30 15:08:00

0

您是否嘗試過使用libcrypto.0.9.dylib或libcrypto.dylib而不是特定版本進行鏈接?

+0

是的。 - 鏈接到'libcrypto.0.9.dylib'導致鏈接器錯誤 - 鏈接到'libcrypto.dylib'鏈接並構建得很好,但應用程序無法在Leopard中啓動。 – adib 2010-04-12 07:40:06

22

按照這個線程在這裏(第一篇文章在螺紋:http://lists.apple.com/archives/cocoa-dev/2009/Aug/msg01737.html,「libcrypto雪豹」線上市:http://lists.apple.com/archives/cocoa-dev/2009/Aug/thrd19.html),我認爲解決的辦法是做到以下幾點:

  1. 轉到/開發人員/SDKs/MacOSX10.5.sdk/usr/lib/。在該文件夾中,將「libcrypto.0.9.7.dylib」複製到您的項目源文件夾中。

  2. 重命名剛剛複製到「libmycrypto.dylib」的文件。

  3. 將剛剛重命名的文件添加到項目中。確保從項目中刪除任何其他鏈接的libcrypto框架。

  4. 通過您的構建設置,並確保您刪除「-lcrypto」鏈接器標誌。 (通常放置在「其他鏈接器標誌」設置中。)

現在您應該可以構建您的項目,它可以在10.5和10.6上運行。

(libcrypto.0.9.7可以在10.5和10.6上使用,你複製的文件只是標題的一個存根,但你只是鏈接到它,而不是將它嵌入到你的項目中。鏈接器使用安裝路徑而不是dylib的實際文件名,將其命名爲「libmycrypto.dylib」消除了路徑衝突,但仍然允許您鏈接到您所需的庫。

FWIW,這是一個Xcode問題。能夠鏈接到/usr/lib/libcrypto.dylib - 符號鏈接 - 並且使它在10.5和10.6上都是正確的libcrypto版本。但是,當構建時,Xcode似乎鏈接到版本0.9.8由於某種原因雪豹。)

+0

很好的答案,就是我在找的東西。乾杯。 – 2010-07-23 10:54:07

+1

如果你想在10.6+上構建你的應用,但是在10.5上運行它,這是你應該使用的答案(不是上面選中的那個)。另外:當你在尋找-lcrypto鏈接器標誌時,記住它們可以是在項目級別設置以及單個目標中都是如此。確保你刪除所有這些。 – chockenberry 2011-08-09 00:56:47

+0

也許這將適用於ObjectiveC,但不適用於C++/gcc。只有通過-isysroot選項使用10.5 SDK才能與0.9.7版本的libssl/libcrypto進行鏈接 - 您不僅需要將LINK與這些dylib進行鏈接,還需要使用其0.9.7的H文件進行編譯。另外,當使用10.5 SDK構建10.7/10.8時,在10.5 SDK的STL頭文件中,有像i686-apple-darwin10這樣的符號鏈接指向i686-apple-darwin9。您需要爲darwin11和darwin12(對於i686和x86_64)創建此類符號鏈接。準確地說,帶有這些符號鏈接的目錄是/MacOSX10.5.sdk/usr/include/c++/4.2.1。 – 2012-12-03 11:39:50

1

根據你使用lib的情況,你可能可以用CommonCrypto替換libcrypto,這對於10.5和10.6都能很好地工作。我只使用libcrypto作爲MD5函數,所以我用CommonCrypto/CommonDigest.h和MD5()用CC_MD5()替換了openssl/md5.h,用CommonCrypto替換了libcrypto,現在它可以在兩個Leopards上工作。

0

Leopard OS X附帶一個只有ppc體系結構的libcrypto和libssl。

一個不需要更改應用程序代碼的簡單解決方案是備份您的libcrypto.0.9.dylib,libcrypto.0.9.8.dylib,libssl0.9.dylib,libssl.0.9.8.dylib和複製libcrypto.0.9.7.dylib和libssl.0.9.7.dylib。

您可以使用Terminal.app在你的應用程序文件夾,使這些變化:

cd /usr/lib 
    sudo cp libcrypto.0.9.dylib libcrypto.0.9.dylib.old 
    sudo cp libssl.0.9.dylib libssl.0.9.dylib.old 
    sudo ln -sf libcrypto.0.9.7.dylib libcrypto.0.9.dylib 
    sudo ln -sf libssl.0.9.7.dylib libssl.0.9.dylib 

這裏有一個替代的解決方案,可以讓你留在最新鮮的OpenSSL的版本:

1. reactivate the current openssl: port activate [email protected]_0 (or whatever) 
    2. clean up your old unwanted versions of everything: port uninstall inactive 
    3. uninstall badly behaved ports: port uninstall md5sha1sum subversion neon 
    4. get them back: port install subversion md5sha1sum