IOS 下编译 LIBCURL gcc clang

主要参考资料:http://www.creativealgorithms.com/blog/content/building-libcurl-ios-42

http://www.takobear.tw/201702608526356260322804024687/opensource-ffmpeg-21-for-ios-xcode-51-os-x-1092 

 

前言:libcurl是一个通用的C++跨平台通讯类库。但是在ios上编译libcurl一度让我们崩溃了数日,英文资料各自重点不同,中文资料又语焉不详,经过仔细研读和实验,终于弄明白,原来该库的编译重点是要根据平台硬件的不同进行配置,例如CURL_SIZEOF_LONG和SIZEOF_LONG在不同的硬件上是不同的,从而生成的库文件也随平台而有所不同,在不同的平台上开发应引用各自对应的库文件。

 

1.  下载并解压:(下载地址) http://curl.haxx.se/download.html

该页上面是原始文件,下面是根据平台预先编译好的库文件,这里没有ios平台的,我们就自己动手来编译了。

2.  配置

a)  打开终端命令行,转至目录

cd curl-7.21.2

b)  编译配置,将下面内容拷贝到终端,回车执行配置

exportCC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-gcc-4.0.1
export CFLAGS="-isysroot/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk"
export LDFLAGS="-isysroot/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk-Wl,-syslibroot/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk"
exportCPP=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp
./configure --disable-shared --without-ssl --without-libssh2--without-ca-bundle --without-ldap --disable-ldap--host=arm-apple-darwin10

实例:根据机子设置正确的SDK,例如本机的sdk4.2不是装在developer下而是装在sdk42下,则如下配置

exportCC=/sdk42/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-gcc-4.2.1

export CFLAGS="-isysroot/sdk42/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk"

export LDFLAGS="-isysroot/sdk42/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk-Wl,-syslibroot/sdk42/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk"

exportCPP=/sdk42/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp

./configure --disable-shared --without-ssl--without-libssh2 --without-ca-bundle --without-ldap --disable-ldap--host=arm-apple-darwin10

出现如下内容表示配置成功:

 IOS <wbr>下编译 <wbr>LIBCURL

 注意:

从XCODE 5的目录中:
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs

3.  编译

a)  打开Xcode选择: File->NewProject->iOS->Library->CocoaTouch Static Library

添加文件:Add->Existing Files (选择curl中"src"文件夹),Add->Existing Files (选择curl中 "lib"文件夹)


删除文件:从项目中删除 "src/macos" 文件夹(Delete->Deletereferences),并且去掉Makefile andMakefile.inc(共四个,src和lib中各两个)的”target”标志。(注意是在project中操作,不是在target中操作)

 

b) 打开“build”选项,查找OTHER_C_FLAGS设置下面信息

-DHAVE_CONFIG_H -I/ca/dev/code/lib/curl/curl-latest/include-I/ca/dev/code/lib/curl/curl-latest/lib


说明: /ca/dev/code/lib/curl/curl-latest就是刚才解压curl源代码的路径,在本机中是

-DHAVE_CONFIG_H -I/Users/rosa/curl-7.21.4/include-I/Users/rosa/curl-7.21.4/lib

c)   正常编译生成库文件

4.  制作通用版本的库文件

由于libcurl在device和simulator上要选择不同的版本,因此在实际使用的时候切换起来很不方便,可以在终端上使用macos 自带的lipo工具制作为通用版本,通用版本的大小其实就是两个版本加起来的和。命令行如下:

lipo -create /ipos-release/libcurl.a /ip-sim-release/libcurl.a-output libcurl-release.a



===================================================================

[OpenSource] 更新ffmpeg 2.1 for iOS,  Xcode 5.1 與OS X 10.9.2

3/22/2014

7 Comments

 



其實這兩天Bear更新了Xcode 5.1以後, 發現一些悲劇...

其中一點就是發現可惡的Xcode 5.1竟然不能再用gcc來編譯了...而是要改成用clang來編譯

當Bear把ffmpeg刪除準備要重新安裝時...就發現可恨的build failed的錯誤了...

為了解決這問題... Bear也花了點時間研究, 總算有點成果了!!! 大家先來看看吧!




點選github下載連結


其實這包script最早的出處是來自於此處 (原始教學出處)

但是Bear下載以後發現這包程式碼在某些情況中問題還蠻多的...

下載以後做了ㄧ些調整, 我們先來看看使用前, 你需要有哪些步驟呢?


首先打開你的Xcode , 確認版本是在5.1以上 (如果你的手機是iOS 7.1, 那你理論上應該是Xcode 5.1)

打開以後, 按下Command + , 鍵  

之後看到以下畫面



確認好Xcode的版本是正確的以後, 這邊開始Bear要提醒幾個重要的轉折變化, 

過去的教學文章中, 會提到Xcode的編譯器所在位置在這個路徑:

/Applications/Xcode.app/Contents//Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc


但是很不幸的, 這次的Xcode 5.1的變動中, 編譯器的位置已經路徑被換了, 也不再使用gcc編譯, 

新版的編譯器路徑在這裡:

/Applications/XCode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang

改成以clang為編譯器的方式, 因為這以前在Xcode 4.6的編譯方法從這時候開始就再也不能用了....

為了解決這煩惱, 許多網友寫了一些新的一鍵安裝腳本(script)


這個script在使用的時候有幾點要特別注意, 

過去Bear在 ffmpeg 與iOS 6.1一文中, 所採用的方法是只有編譯i386 

也就是只有模擬器的方式, 這次的script中做了一些比較大的變動

其中一點就是編譯的架構同時包含了armv7 與armv7s 以及i386

換言之, 這次編譯好的ffmpeg library, 可以放在模擬器上或是手機上跑都是沒問題的!!!


可以想像一下, 如果接下來一陣子蘋果沒有更換編譯器的位置路徑的話, 

這個script有幾個很方便的地方



如果你只是想要改ffmpeg的版本以及iOS的版本,

只需要在腳本的最上方做設定, VERSION代表的是ffmpeg你要下載安裝的版本

而SDKVERSION代表的是iOS SDK的版本



因為要編譯3個不同的架構, 從一開始的編譯上會有一些設定的不同

針對不同的平台中, 我們的configure設定內容會有所不同

之前原本在ffmpeg的教學文中所提到的設定, 理論上這邊都可以涵蓋的到


如果大家之後有要編譯libx264之類的, 只要到這一段程式碼進行修改就行了


不過大家要注意一點, 這邊編譯出來的資料夾是連接到一個叫做dependencies的資料夾內

如果大家之後要用到像是libx264之類的函式庫, 

是有必要先把檔案放到這個資料夾內的, 或是大家就要在修改這邊的configure內容後再編譯才行喔!


最後編譯完成以後, 會再把三個不同架構的.a檔案, 利用libp這個命令來把它們整合在一起

也就是以下這段程式碼



這邊說了這些, 那還要注意一些問題, 

原始教學出處中所提到的gas script

在某些情況下似乎會有版本的指定問題, 如果大家原本的/usr/local/bin資料夾內

是已經有gas-preprocessor.pl這個檔案的話, 是會有一些狀況的, 也因此Bear才做了些調整如下


就是這麼簡單就能運作了!!!

原版的教學中, Bear只有針對i386做調整, 新版的script已經可以把它整個打包起來變成一個新的package給不同架構使用

讓我們看看script執行的結果吧!!



到build->built內後, 就能看到以下的打包結果了



點選Universal的部分, 就能看到include的路徑以及lib的資料夾

include的路徑就是在Xcode內所要指定的Header Path

lib的路徑則是Library Path, 

以一個新專案為例, 大家可以採用以下步驟, 這邊Bear先建立一個新專案名為FFmepgDemo_2014



先把universal的資料夾整個拖曳過去



建議大家要把Copy items into destination group's folder (if needed)給勾選起來

這樣專案的管理上之後是有好處的!

接下來請大家到Build Setting的部分, 

我們要修改兩個Path路徑好讓Compiler在編譯的時候能正確地連結到function





做法也相當簡單, 把universal的include資料夾給拖曳到 Header Search Path內就行了

(注意請找到在FFmpegDemo_2014的資料夾, 我們希望連接的Header Path是你剛剛copy進專案的標頭檔)


另外就是重複一樣的步驟對Library Search Paths, 

基本上要確認的就是

Header Search Paths內要有一欄 $(PROJCET_DIR)/FFmpegDemo_2014/universal/include的路徑

Library Search Paths 內要有$(PROJCET_DIR)/FFmpegDemo_2014/universal/lib的路徑



確認這兩點以後呢, 還有幾點要做, 請先到

Build Phases內, Link with Binaries的部分加上一個Library: libz1.2.5 



如果沒有的話, 編譯的時候會有以下的錯誤畫面喔!!



這邊需要注意一下, Bear為了使教學能夠簡潔

所使用的Sample Code是修改自以前的專案內容: 如何利用ffmpeg製作iOS 廣播電台 


不過, 即使完成這些步驟後, 還是不行的噢!!!

因為Xcode 5.1預設編譯的時候會打開arm64, 以64位元方式編譯

但是因為我們編譯的項目只包含了armv7, armv7s, i386

假如你使用了iPhone 5s編譯的話, 編譯器是會報錯的噢!! 

為了避免這種問題, 在Build Settings的項目中也要有對應的修改如下圖



確認好以後, 就能夠正確的編譯囉!!!!


Bear再簡單總整理一下, 一個ffmpeg的專案內, 大家需要確保有以下幾項內容:

1. library 的.a檔案有沒有在專案內 (不在專案內的話, 請確認在Build Settings的Library Search Paths有沒有正確指定到位置)

2. include的檔案有沒有在專案內 (不在專案內的話, 請確認在Build Settings的Header Search Paths有沒有正確指定到位置)

3. 確認專案內有沒有包含libz1.2.5.dylib

4. 確認Build Settings 的Build Active Architecture Only是NO 以及Valid Architectures有沒有不被包含的架構(例如arm64)


確認有以下四點以後, 基本上就是沒問題的了!!!!


最後我們在來討論一些常見的ffmpeg編譯錯誤該如何解決:


1. cputype (12) does not match previous archive members cputype (7)(all members must match)

通常是指沒有在clean build後的編譯發生的問題, 可以參考此篇解決


2. armv7, armv7s 確認./configure有加上這兩項目

--disable-armv6 \ 

--disable-armv6t2 \



3. ERROR: .endm without .macro at /usr/sbin/gas_preprocessor.pl

這個錯誤比較棘手, Bear被這問題煩了好幾天

一般來說是出現在你的系統內有兩個以上的gas_preprocessor.pl檔案

這邊在測試的時候, 請注意看一下install-ffmpeg.sh檔案, 裡面的是針對

/usr/local/bin/gas-preprocessor.pl 這個檔案進行操作

如果有遇到的話, 理論上只要下載本次教學中的git後執行就不會有問題了


4. 這次的install-ffmpeg中有限制iOS版本在 -miphoneos-version-min=${SDKVERSION}

以這次的script中, Bear已經限制了只能在iOS 7.1的版本, 有需要調整的人只要把這一行給拿掉後在做相關測試就好


5. ffmpeg執行時遇到相關問題的話, 把./configure的--disable-debug 改為 --enable-debug --disable-stripping即可。

由於開啟debug後的檔案會相差很大, 根據網友經驗相差會有約7倍大小的差異, 請大家自行注意



參考資料: Albert, CNBlogs(1), CNBlogs(2), Bear實驗室: ffmpeg廣播電台


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值