2015-06-19 84 views
4

我正在嘗試鏈接libssl.alibcrypto.a靜態庫在XCode命令行項目[在鏈接二進制庫下]。我已將Openssl頭文件包含在搜索路徑中。靜態鏈接XCode中的OpenSSL

編譯成功,但執行失敗,dyld: Library not loaded: /usr/local/ssl/lib/libcrypto.1.0.0.dylib

爲什麼當我靜態鏈接它時會尋找dylib?這怎麼解決?

任何幫助將是可觀的。

+0

Anil - 這是iOS,OS X還是兩者? – jww

回答

5

爲什麼在我靜態鏈接它時尋找dylib?這怎麼解決?

蘋果的連接器使用如果可用的dylib或共享對象,不管你的連接標誌像-rpath-Bstatic的。他們甚至在iOS上執行此操作,但不允許使用dylib!

一旦你知道它的一種衆所周知的問題:)請參閱,例如,Installing Crypto++ 5.6.2 on Mac OS X。 Crypto ++與Apple的工具存在相同的問題。

的解決方法是使用-L-l選項停止,併到目標文件或存檔直接鏈接。檔案只是對象文件的集合,因此您可以互換使用它們。

要指定鏈接器的目標文件或存檔,請參閱Linking to an object file。在Xcode下,您將完全指定的存檔名稱(如/usr/local/openssl-ios/lib/libcrypto.a)添加到其他鏈接器標記OTHER_LDFLAGS Xcode選項)。

當添加完整存檔到OTHER_LDFLAGS,我相信你只是將它加入逐字沒有任何開關,就像-l-L。您可能需要-Wl-Wl,/usr/local/openssl-ios/lib/libcrypto.a),但你使用-l-l/usr/local/openssl-ios/lib/libcrypto.a)。

當選項通過編譯器驅動程序傳遞給鏈接器時,使用-Wl。如果直接調用鏈接器,則不需要-Wl,不應使用它。


第二選項是設置GCC_LINK_WITH_DYNAMIC_LIBRARIESYES。蘋果公司似乎沒有在Xcode Build Setting Reference中記錄它,但它明顯在我的Xcode副本下。請參閱Stack Overflow上的How to link a static library for iOS

我似乎記得過去有這個問題。它是理論上應該起作用但在實踐中不起作用的那些事情之一。


第三種選擇是去除在Xcode下使用的所有路徑的dylib或共享對象,以便利用-lcrypto時Xcode的不小心找到它。


第四選擇是使用允許動態鏈接,但與DYLD_LIBRARY_PATH執行該程序。它的OS X相當於LD_LIBRARY_PATH,並確保您的OpenSSL副本被加載(如1.0.2),而不是系統的OpenSSL版本(0.9.8)。

但我不喜歡這個選項,因爲它需要你的軟件用戶去做一些事情。


另一種可能是由於消息dyld: Library not loaded: /usr/local/ssl/lib/libcrypto.1.0.0.dylib是代碼簽名庫的副本。它有點奇怪它的發現,但沒有加載,所以我打算把它扔在那裏,以防其OS X的Code SigningGatekeeper Service ...

要在MAC開發人員程序的代碼簽名您的副本,只是:

codesign -fs "Johnny Developer" /usr/local/ssl/lib/libcrypto.so 
+0

非常感謝。 1)如果我在OTHER_LINKER_FLAGS中使用-Wl,$ path_to_lib.a,即使我從「Link Binary With Library」中刪除這些庫,它也能正常工作。這怎麼可能?我希望預裝在MAC上的openssl不會干擾? 2)是否默認安裝在MAC-OSX上的openssl?如果我們直接使用它(使用NSTask)而不進入靜態或動態鏈接的複雜性,那麼它會起作用。 – Abhinav

+0

它正在挑選正確的版本。我已經構建了靜態庫版本1.0.2a,並且SSLeay_version的輸出是1.0.2a 3月19日。如果openssl是預安裝的,那麼我們可以直接通過NSTask直接調用openssl函數,而無需將其與項目鏈接起來,這也是有意義的嗎? – Abhinav

+0

*「1.0.2a 3月19日」* - 1.0.2c是最新版本,它有安全錯誤修復。 *「如果openssl預裝了,是否有意義......」 - 蘋果公司的OpenSSL版本是0.9.8。它缺乏大多數EC支持,TLS 1.1和TLS 1.2(等等)。你應該避免它。 – jww