最近項目需要在IOS上使用Curl庫,所以最重要的就是先把這個庫編譯出來。在網上也參考了一些文章,下面把我自己實踐的過程記錄下來,供以后參考。
1.從官方下載Curl源代碼。地址:http://curl.haxx.se/download.html
由於在列表中沒有基於IOS編譯出來的二進制版本,所以只能下載源代碼來自己編譯。所以我選擇最新的7.26代碼壓縮包。
2.解壓源代碼,用命令行終端進入源代碼目錄。
3.執行配置命令。
命令1:
CC=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2
命令2:
export CFLAGS="-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk"
命令3:
export LDFLAGS="-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk -Wl,-syslibroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk"
命令4:
export CPP=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-cpp-4.2
命令5:
export AR=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ar
命令6:
export RANLIB=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ranlib
命令7:
./configure --disable-shared --without-ssl --without-libssh2 --without-ca-bundle --without-ldap --disable-ldap --host=arm-apple-darwin10
需要注意:
(1) 這里格式限制,會有自動換行。其實每個命令都必須在一行。
(2) 這里的路徑是我機器上的路徑,僅供參考。在選擇目錄的時候要看清楚目錄中指定的那個文件是否存在。(上文中紅色字標識)。
(3) 這里說明的文件都是基於IOS5.1系統的。IOS4.x版本中文件名稱不一致。(下面是4.2到5.1的對照關系)
arm-apple-darwin10-gcc-4.2.1 ===> arm-apple-darwin10-llvm-gcc-4.2
iPhoneOS4.2.sdk ===> iPhoneOS5.1.sdk
cpp ===> llvm-cpp-4.2
(4)如果配置正確,命令7執行時不會出現報錯。如果報錯也不要緊,會提示查看錯誤日志。打開日志仔細看看就知道問題出在哪里,比如某個執行程序或文件沒找到之類的。
4.在Xcode中建立Cocoa Touch Static Library工程,將代碼中的src和lib目錄的所有文件添加進工程。刪除src/macos 目錄中的文件。並且把 Makefile 和 Makefile.inc從target中去掉。
5.選中項目的Target查看屬性,在info頁面中搜索 other C Flags 這個名稱。並在該項下面添加如下命令:
-DHAVE_CONFIG_H -I/Users/XXX/curl-7.26.0/include -I/Users/XXX/curl-7.26.0/lib
其中路徑需要修改成自己機器上該文件夾所在的路徑。
6.編譯虛擬機版本和真機版本。
7.最后一步,使用lipo命令制作模擬器和真機通用版本的靜態庫。通用版本就是在測試時這個靜態庫可以在虛擬機上用,也可以在設備上用。其實該命令就是把兩個版本的.a文件合並成一個。
lipo -create /XXX/libcurl.a /XXX/libcurl.a -output libcurl-release.a
在把這個靜態庫添加進項目以后,編譯的時候報錯,那就需要在項目中添加 libz.dylib 的動態鏈接庫。