我正在嘗試鏈接libssl.a
和libcrypto.a
靜態庫在XCode命令行項目[在鏈接二進制庫下]。我已將Openssl頭文件包含在搜索路徑中。靜態鏈接XCode中的OpenSSL
編譯成功,但執行失敗,dyld: Library not loaded: /usr/local/ssl/lib/libcrypto.1.0.0.dylib
。
爲什麼當我靜態鏈接它時會尋找dylib?這怎麼解決?
任何幫助將是可觀的。
我正在嘗試鏈接libssl.a
和libcrypto.a
靜態庫在XCode命令行項目[在鏈接二進制庫下]。我已將Openssl頭文件包含在搜索路徑中。靜態鏈接XCode中的OpenSSL
編譯成功,但執行失敗,dyld: Library not loaded: /usr/local/ssl/lib/libcrypto.1.0.0.dylib
。
爲什麼當我靜態鏈接它時會尋找dylib?這怎麼解決?
任何幫助將是可觀的。
爲什麼在我靜態鏈接它時尋找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_LIBRARIES
到YES
。蘋果公司似乎沒有在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 Signing或Gatekeeper Service ...
要在MAC開發人員程序的代碼簽名您的副本,只是:
codesign -fs "Johnny Developer" /usr/local/ssl/lib/libcrypto.so
非常感謝。 1)如果我在OTHER_LINKER_FLAGS中使用-Wl,$ path_to_lib.a,即使我從「Link Binary With Library」中刪除這些庫,它也能正常工作。這怎麼可能?我希望預裝在MAC上的openssl不會干擾? 2)是否默認安裝在MAC-OSX上的openssl?如果我們直接使用它(使用NSTask)而不進入靜態或動態鏈接的複雜性,那麼它會起作用。 – Abhinav
它正在挑選正確的版本。我已經構建了靜態庫版本1.0.2a,並且SSLeay_version的輸出是1.0.2a 3月19日。如果openssl是預安裝的,那麼我們可以直接通過NSTask直接調用openssl函數,而無需將其與項目鏈接起來,這也是有意義的嗎? – Abhinav
*「1.0.2a 3月19日」* - 1.0.2c是最新版本,它有安全錯誤修復。 *「如果openssl預裝了,是否有意義......」 - 蘋果公司的OpenSSL版本是0.9.8。它缺乏大多數EC支持,TLS 1.1和TLS 1.2(等等)。你應該避免它。 – jww
Anil - 這是iOS,OS X還是兩者? – jww