1. 程式人生 > >在Linux下交叉編譯生成iOS工具鏈指導手冊

在Linux下交叉編譯生成iOS工具鏈指導手冊

1.前言

 我們需要在Linux系統上實現交叉編譯並動態下發Android和iOS的靜態庫或者動態庫,而其中最為關鍵的就是Android NDK和iOS工具鏈的生成。由於Android 的實現起來相對容易,這裡重點講述iOS端生成工具鏈的實現過程。下面的操作需要在Macbook上到處SDK

2.所需資源

  2.1   VirtualBox (https://www.virtualbox.org/)

  2.2   Ubuntu Desktop(最新版本版本)(https://www.ubuntu.com/download/desktop)

  2.3   LLVM/Clang(>=5.0)(http://releases.llvm.org/download.html#5.0.0)

  2.4   openssl(https://github.com/openssl/openssl

  2.5   automake(http://ftp.gnu.org/gnu/automake/

  2.6   autogen(http://ftp.gnu.org/gnu/autogen/

  2.7   libtool(

http://ftp.gnu.org/gnu/libtool/

  2.8   autoconf(http://ftp.gnu.org/gnu/autoconf/

  2.9   libssl-dev(https://pkgs.org/download/libssl-dev

  2.10  python(https://www.python.org/downloads/

  2.11  cctools-port(https://github.com/tpoechtrager/cctools-port

  2.12  cmake(

https://cmake.org/download/

  2.13  iOS-SDK(http://resources.airnativeextensions.com/ios/

3.資源配置和安裝

  3.1   VirtualBox和Ubuntu Desktop的安裝方

可以網上下載好之後,直接安裝完成。

3.1.1 如何配置Ubuntu與真機之間傳送資料。

(1)開啟安裝的Ubuntu虛擬機器的設定。並點選左邊的“常規”,選擇“高階”選項卡,選擇“共享貼上板”和“拖放”的“雙向”。

(2)選擇左邊的“儲存”,並勾選硬碟“控制器:SATA”屬性的“使用主機輸入輸出(I/O)快取”。

(3)步驟1和2可以完成真機和虛擬機器之間共享硬碟。但是如果傳送大檔案不太方便。但是VirtualBox不支援檔案的拖放。所以這裡需要設定共享資料夾實現檔案共享。點選“共享資料夾”然後新建資料夾。

(4)重啟虛擬機器

(5)在虛擬機器的桌面或者Home下即可看到共享資料夾。

 

  3.2  LLVM/Clang 的安裝方法

     3.2.1: 下載LLVM、Clang、Compiler-rt(可選)、Clang-tools-extra(可選)原始碼並解壓。LLVM解壓後的檔名改為llvm,Clang解壓後的檔名改為clang,Compiler-rt解壓後的檔名改為compiler-rt,Clang-tools-extra解壓後的檔名改為clang-tools-extra

     3.2.2: 把clang放入llvm/tools/目錄下,把compiler-rt放入llvm/projects/目錄下,把clang-tools-extra放入llvm/tools/clang/tools/目錄下

     3.2.3: 返回到llvm的同級目錄,mkdir llvmbuild(檔名自己取,合理即可)

     3.2.4 :cd llvmbuild,然後執行 cmake ../llvm -DLLVM_ENABLE_ASSERTIONS=OFF -DCMAKE_BUILD_TYPE=RELEASE

     3.2.5 :3.2.4執行結束後,執行make -jN(其中N為你為你的虛擬機器設定的處理器核心數,如下圖所示)

     

      如上圖,我為我的虛擬機器設定了1個處理器核心,所以我應該寫 make -j1

    3.2.6:3.2.5 執行完成成功後,執行 sudo make install ,到此llvm、clang的安裝已經完畢

  3.3 安裝openssl

   3.3.1 官方給出的方法

      3.3.1.1 解壓檔案

         tar -xf openssl-1.0.1g.tar.gz(建議下載最新的版本)

      3.3.1.2 配置

         ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl

      3.3.1.3 編譯

         make

       3.3.1.4 安裝

         sudo make install

       3.3.1.5 設定環境變數

          sudo gedit ~/.bashrc,新增export PATH=/usr/local/openssl/bin:$PATH,儲存並推出。最後執行 source ~/.bashrc 使環境變數生效。

    3.3.2 建議使用的安裝方法

       3.3.2.1 直接使用 sudo apt-get install openssl 指令安裝

   3.4 安裝automake

     3.4.1 建議直接使用 sudo apt-get install automake 指令安裝

   3.5 安裝autogen

      3.5.1 建議直接使用 sudo apt-get install autogen 指令安裝

   3.6 安裝libtool

      3.6.1 建議直接使用 sudo apt-get install libtool 指令安裝

   3.7 安裝autoconf

       3.7.1 建議直接使用 sudo apt-get install autoconf 指令安裝

   3.8 安裝 libssl-dev

       3.8.1 建議直接使用 sudo apt-get install libssl-dev 指令安裝

   3.9 安裝 python

       3.9.1 建議直接使用 sudo apt-get install python 指令安裝

   3.10 cctools-port

       3.10.1 直接解壓,無需其他操作

   3.11 安裝cmake

      3.11.1 下載原始碼後解壓

       3.11.2 cd 檔名,執行./bootstrap指令

       3.11.3 make -jN(此處的N根據你分配的虛擬機器的處理器核心數而定)

       3.11.4 前面都沒問題之後,執行sudo make install,都完成後你可以執行 cmake --version來驗證是否安裝成功

  3.12 找臺MacBook做iOS SDK 打包步驟(在此我是利用Xcode9.1,打包iOS11.1SDK的。如果需要打包iOS8、iOS9、iOS10等SDK,下面的方法同樣適用,注意下面的tmp是我們臨時建立的路徑)(如果需要打包Simulater的SDK,需要修改路徑)

       3.12.1: SDK=$(ls -l /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs | grep " -> iPhoneOS.sdk" | head -n1 | awk '{print $9}')

       3.12.2:cp -r /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk /tmp/$SDK 1>/dev/null

       3.12.3:cp -r /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1 /tmp/$SDK/usr/include/c++ 1>/dev/null

       3.12.4:pushd /tmp

       3.12.5:tar -cvzf $SDK.tar.gz $SDK(至此我們需要的對應版本的iOS SDK已經打包完成)

       3.12.6:rm -rf $SDK

       3.12.7:mv $SDK.tar.gz ~

       3.12.8:popd (至此我們在將要生成iOS工具鏈前的準備工作已經全部完成)

4.在Ubuntu上搭建iOS工具鏈(在此生成的支援armv7、armv7s的工具鏈,我用的是iOS9.3sdk)

  4.1 生成arm64工具鏈

      4.1.1 cd cctools-port

      4.1.2 執行 IPHONEOS_DEPLOYMENT_TARGET=8.0 usage_examples/ios_toolchain/build.sh ~/iPhoneOS11.2.sdk.tar.gz arm64

      4.1.3 製作工具鏈成功後會提示*** all done ***,此時cctools-port/usage_examples/ios_toolchain/下的target 就是我們要的工具鏈(至此arm64的工具鏈已經生成)

     4.1.4 進入/usr/local,我們建立一個檔案,命名為iOS-arm64,然後返回到cctools-port/目錄 ,執行 sudo mv usage_examples/ios_toolchain/target /usr/local/iOS-arm64

     4.1.5 執行sudo cp /usr/local/iOS-arm64/target/lib/libtapi.so /usr/lib/

     4.1.6 執行 export PATH=$PATH:/usr/local/iOS-arm64/target/bin

     4.1.7 驗證我們的工具鏈是否可以使用(下面的圖片很重要)

      

       4.1.7.1 cd cctools-port-master/usage-examples/ios_toolchain/target/

       4.1.7.2 mkdir src (建立檔案src)

       4.1.7.3 vim test.c(建立一個.c檔案)

       4.1.7.4 arm-apple-darwin11-clang -xc -c test.c(編譯.c檔案,生成.o檔案)

       4.1.7.5 arm-apple-darwin11-ar cr libtest.a test.o(把.o檔案編譯成.a庫,我取靜態庫的名字為libtest.a)

       4.1.7.6 如果你順利的走到這一步的話,Congratulations, you 0.0000001 meters distance from success,下面就是把test.c和libtest.a檔案 copy出來,在你的Xcode上驗證我們用iOS -arm64工具鏈生成的靜態庫,能否正常使用。

4.2 生成其它工具鏈方法基本同上

4.3 工具鏈的常用命令使用

你可以到/usr/local/iOS-arm64/target/bin目錄下檢視常用的命令,與Linux命令不同之處在於前面會加上“arm-apple-darwin11-”。常用命令包括“arm-apple-darwin11-gcc”, “arm-apple-darwin11-ar”, “arm-apple-darwin11-ranlib”, “arm-apple-darwin11-lipo”等。

  1. 常用arm-apple-darwin11-lipo檢測當前build的lib的Architecture。比如我們想看生產的包test.a是哪個architecture,可以用命令“arm-apple-darwin11-lipo –info test.a”
  2. 在使用工具鏈的時候要記得指定平臺(-miphoneos-version-min=7.0),否則編譯容易出錯。