編譯支援iOS的libcurl+OpenSSL庫(支援https IPv6)

Auditore發表於2018-01-03

libcurl使用起來不難,但編譯對應的iOS庫檔案卻是個大問題,編譯過程中可能各種報錯,網上找的庫可能libcurl版本或者OpenSSL版本不符合要求,這時候就得自己找對應的OpenSSL和libcurl原始碼自己編譯了。本文介紹的方案支援IPv6,混編openssl後可以支援https請求。

1.編譯準備

我是從網路上找的指令碼進行編譯的,但是很多指令碼都是不能用的,這個過程中浪費了很多時間,最後終於找到了可用的,GitHub連結如下: https://github.com/sinofool/build-libcurl-ios https://github.com/sinofool/build-openssl-ios 這兩個連結裡的指令碼都下載下來,單獨放到一個資料夾裡面。 然後去openssl的官網https://www.openssl.org/source/和curl的官網https://curl.haxx.se/download.html 下載最新的原始碼,如下圖

openssl原始檔
curl原始檔

下載好了原始碼後也一起放入剛剛指令碼所在的資料夾,並且把原始碼解壓出來得到兩個原始碼資料夾,最後該資料夾內容應該是如下圖所示:

所需的全部檔案

然後為了防止因為指令碼沒有許可權而無法執行,我們需要賦予指令碼可執行許可權。也很簡單,比如要賦予build_libcurl_dist.sh執行許可權,我們開啟終端,cd進入build_libcurl_dist.sh所在的資料夾,然後執行chmod 777 build_libcurl_dist.sh就OK了。順帶也對build_openssl_dist.sh同樣操作。

到這我們的準備工作就完成了。

2.開始編譯

編譯openssl 要支援https所以我們先得編譯openssl,然後再把openssl庫混編進libcurl中。 cd 進入我們上圖中的openssl-1.1.0g原始碼資料夾,然後把build_openssl_dist.sh拖進終端,回車,就開始編譯openssl了,編譯完,你會發現桌面多了一個資料夾,裡面放著openssl的庫和.h檔案,如下圖:

openssl編譯結果

編譯libcurl 這時候,就該編譯libcurl了,先cd進入curl-7.56.1原始碼資料夾,接著把build_libcurl_dist.sh指令碼拖進終端,回車,等待編譯完成,你會看到桌面上多了一個libcurl-ios-dist資料夾,裡面就是我們最終得到的支援https、IPv6的庫和.h檔案了。注意下,剛剛那些openssl的.h也已經被混編入libcurl.a了,所以我們引用的時候不需要把openssl的那些檔案拖進工程。

3.如何使用libcurl

使用說明就不多說了,很簡單的,把編譯得到的libcurl-ios-dist資料夾直接拖進工程,然後在工程裡Targets的General 中,引用下libz.tbd這個系統庫,使用curl的時候, #include "curl.h"就OK了。 如果想檢視libcurl的版本號,printf("\nlibcurl verrsion %s\n",curl_version());。列印結果是libcurl/7.56.1 SecureTransport後面的 SecureTransport表示支援ssl,但是openssl的具體版本號目前我沒找到對應的方法可以列印,下面這種方式列印出來的結果是openssl version SecureTransport和上面一致,就是告訴你支援ssl但不告訴你版本號。

curl_version_info_data *data=  curl_version_info(CURLVERSION_NOW);
printf("\nopenssl version %s\n",data->ssl_version);
複製程式碼

這個data結構體有一個long ssl_version_num; /* not used, always zero */這個屬性,但官方文件告訴你,這屬性用不了,只會返回0,我試過確實是只能返回0...不知道官方怎麼想的。

具體如何用libcurl發起請求,請看我的另外一篇文章iOS用libcurl發起一個get請求,並儲存返回資料到沙盒

4.尾聲

簡單概括就是,工欲善其事必先利其器,編譯本身很簡單,不過這個找對指令碼就很折磨人了,網路上的其餘指令碼基本上都是不能編譯最新的庫的。希望給被困在這個問題上的同學們一點幫助。

相關文章