2014-04-01 74 views
1

我在我的ios項目中使用openssl,因此我使用github的構建腳本構建了一個靜態庫:https://github.com/x2on/OpenSSL-for-iPhone。我在我的xcode項目中包含了libcrypto.a和libssl.a,並且可以成功地使用所有的openssl函數。 現在我想支持openssl壓縮。問題:創建的庫似乎不支持任何壓縮方法(SSL_COMP_get_compression_methods()爲空)。iOS上的OpenSSL壓縮設備

所以我添加zlib的動態屬性:

./Configure iphoneos-cross --openssldir="${CURRENTPATH}/bin/${PLATFORM}${SDKVERSION}-${ARCH}.sdk" zlib-dynamic 

我加libz.dylib到鏈接與部分:

http://oi60.tinypic.com/2ljlqmb.jpg

現在壓縮工作在模擬器,但無法在設備上。據我所知,iOS上不允許使用動態庫。但是libz.dylib是一個系統庫。 openssl能否在設備上使用集成的zlib?如果沒有,是否可以在iOS設備上使用openssl進行壓縮?

回答

1

你是對的,iOS已經包含libz.dylib。因此,你應該能夠鏈接到它:

  • 在「構建階段」刪除已添加libz.dylib;
  • 在「Build Settings」中找到名爲「Other Linker Flags」的設置並添加-lz;
  • 請注意,zlib.h也可作爲iOS SDK的一部分,因此不需要另一個。

這應該允許您的應用程序爲模擬器和設備都構建。

編輯

以上不能解決問題。實際問題由zlib-dynamic OpenSSL配置引起。使用此選項,OpenSSL會嘗試在運行時加載libz.so(並且因爲它在iOS上被命名爲libz.dylib而無法這樣做)。通過將zlib-dynamic替換爲zlib並重新構建OpenSSL,很容易解決。如果使用新建庫導致鏈接器錯誤,請檢查答案的第一部分。

+0

你的解決方案來得到相同的結果:我可以編譯應用程序,它可以在模擬器和設備上工作,但壓縮只能在模擬器中工作。有沒有其他解決方案可以使壓縮工作?也許用包含的zlib構建openssl? – Stefan

+0

對不起,我一定誤會/誤解了這個問題:我的印象是,你正在爲一個設備發送* build *錯誤。如果您看不到構建/鏈接錯誤,但是運行時行爲不同,那麼我認爲值得查看OpenSSL'Configure' /'make'日誌。也許'配置'沒有找到它需要爲設備構建啓用'libz'的東西。 – Andrey

+0

好的,我花了一些時間來研究,看起來問題的根源在於'zlib-dynamic'選項。用'zlib'代替它,你很好。不要忘記鏈接到'libz'!我已通過您鏈接的腳本構建OpenSSL進行了驗證。 'zlib-dynamic'會導致錯誤,因爲OpenSSL無法在運行時打開'libz.so' - 它在iOS上稱爲'libz.dylib'; 'zlib'將嘗試在鏈接時解析符號(如果不通過'-lz',將導致鏈接錯誤)。另外,如果你只修改'iphone-cross'目標,那麼64位模擬器將不支持zlib。 – Andrey