Build過程(objc),build過程objc

來源:互聯網
上載者:User

Build過程(objc),build過程objc

看到這篇文章,留下來做筆記

近些日子我們被寵壞了 -- 我們只需要單擊 Xcode 中的一個按鈕(這個按鈕看起來有點像是在播放一些音樂的動作),過幾秒鐘之後,我們的程式就會運行起來了,除非遇到一些錯誤,這非常的神奇。

在本文中,我們將從更進階別的角度來解讀 Build 過程,並探索一下在 Xcode 介面中暴露出的 project setting 資訊與 Build 過程有什麼關係。為了更加深入的探索 Build 過程中,每一步實際執行的工作,我都會在本文中引入一些別的文章。

解密 Build 日誌

為了瞭解 Xcode build 過程的內部工作原理,我們首先把突破口瞄準完整的 log 檔案上。開啟 Log Navigator ,從列表中選擇一個 Build ,Xcode 會將 log 檔案很完美的展現出來。

預設情況下,上面的 Xcode 介面中隱藏了大量的資訊,我們通過選擇任務,然後點擊右邊的展開按鈕,就能看到每個任務的詳細資料。另外一種可選的方案就是選中列表中的一個或者多個任務,然後選擇按鍵組合 Cmd-C,這將會把所有的純文字資訊拷貝至粘貼板。最後,我們還可以選擇 Editor 菜單中的 "Copy transcript for shown results",以此將所有的 log 資訊拷貝到粘貼板中。

本文給出的樣本中,log 資訊將近有 10,000 行(其實大多數的 log 資訊是編譯 OpenSSL 時產生的,並不是我們自己所寫的代碼產生的)。下面我們就開始吧!

注意觀察輸出的 log 資訊,首先會發現 log 資訊被分為不同的幾大塊,它們與我們工程中的targets相互對應著:

Build target Pods-SSZipArchive...Build target Makefile-openssl...Build target Pods-AFNetworking...Build target crypto...Build target Pods...Build target ssl...Build target objcio

本文涉及到的工程有幾個依賴項:其中 AFNetworking 和 SSZipArchive 包含在 Pods 中,而 OpenSSL 則以子工程的形式包含在工程中。

針對工程中的每個 target,Xcode 都會執行一系列的操作,將相關的源碼,根據所選定的平台,轉換為機器可讀的二進位檔案。下面我們詳細的瞭解一下第一個 target:SSZipArchive。

在針對這個 target 輸出的 log 資訊中,我們可以看到每個任務被執行的詳細情況。例如第一個任務是處理一個先行編譯標頭檔(為了增強 log 資訊的可讀性,我省略了許多細節):

(1) ProcessPCH /.../Pods-SSZipArchive-prefix.pch.pch Pods-SSZipArchive-prefix.pch normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler    (2) cd /.../Dev/objcio/Pods        setenv LANG en_US.US-ASCII        setenv PATH "..."    (3) /.../Xcode.app/.../clang             (4) -x objective-c-header             (5) -arch armv7             ... configuration and warning flags ...            (6) -DDEBUG=1 -DCOCOAPODS=1             ... include paths and more ...            (7) -c             (8) /.../Pods-SSZipArchive-prefix.pch             (9) -o /.../Pods-SSZipArchive-prefix.pch.pch

在 build 處理過程中,每個任務都會出現類似上面的這些 log 資訊,我們就通過上面的 log 資訊進一步瞭解詳情。

  1. 類似上面的每個 log 資訊塊都會利用一行 log 資訊來描述相關的任務作為起點。 
  2. 接著輸出帶縮排的3行 log 資訊,列出了該任務執行的語句。此處,工作目錄發生了改變,並對 LANG 和 PATH 環境變數進行設定。 
  3. 這裡是發生奇蹟的地方。為了處理一個.pch檔案,調用了 clang,並附帶了許多可選項。下面跟著輸出的 log 資訊顯示了完整的調用過程,以及所有的參數。我們看看其中的幾個參數... 
  4. -x 標示符用來指定所使用的語言,此處是 objective-c-header。 
  5. 目標架構指定為 armv7。 
  6. 暗示 #defines 的內容已經被添加了。 
  7. -c 標示符用來告訴 clang 具體該如何做。-c 表示:運行前置處理器、詞法分析器、類型檢查、LLVM 的產生和最佳化,以及 target 指定彙編代碼的產生階段,最後,運行彙編器以產出一個.o的目標檔案。 
  8. 輸入檔案。 
  9. 輸出檔案。

雖然有大量的 log 資訊,不過我不會對每個任務做詳細的介紹。我們的重點是讓你全面的瞭解在整個 build 過程中,哪些工具會被調用,以及背後會使用到了哪些參數。

針對這個 target ,雖然只有一個 .pch 檔案,但實際上這裡對 objective-c-header 檔案的處理有兩個任務。通過觀察具體輸出的 log 資訊,我們可以知道詳情:

ProcessPCH /.../Pods-SSZipArchive-prefix.pch.pch Pods-SSZipArchive-prefix.pch normal armv7 objective-c ...ProcessPCH /.../Pods-SSZipArchive-prefix.pch.pch Pods-SSZipArchive-prefix.pch normal armv7s objective-c ...

從上面的 log 資訊中,可以明顯的看出 target 針對兩種架構做了 build -- armv7 和 armv7s -- 因此 clang 對檔案做了兩次處理,每次針對一種架構。

在處理先行編譯標頭檔之後,可以看到針對 SSZipArchive target 有另外的幾個任務類型。

CompileC ...Libtool ...CreateUniversalBinary ...

顧名思義:CompileC 用來編譯 .m 和 .c 檔案,Libtool 用來從目標檔案中構建 library,而 CreateUniversalBinary 則將上一階段產生的兩個 .a 檔案(每個檔案對應一種架構)合并為一個通用的二進位檔案,這樣就能同時在 armv7 和 armv7s 上面運行。

接著,在工程中其它一些依賴項也會發生於此類似的步驟。AFNetworking 被編譯之後,會與 SSZipArchive 進行連結,以當做 pod library。OpenSSL 編譯之後,會接著處理 crypto 和 ssl target。

當所有的依賴項都 build 完成之後,就輪到我們程式的 target 了。Build 該 target 時,輸出的 log 資訊會包含一些非常有價值,並且之前沒有出現過的內容:

PhaseScriptExecution ...DataModelVersionCompile ...Ld ...GenerateDSYMFile ...CopyStringsFile ...CpResource ...CopyPNGFile ...CompileAssetCatalog ...ProcessInfoPlistFile ...ProcessProductPackaging /.../some-hash.mobileprovision ...ProcessProductPackaging objcio/objcio.entitlements ...CodeSign ...

在上面的工作清單中,根據名稱不能區分的唯一任務可能就是 LdLd 是一個 linker 工具的名稱,與 libtool 非常相似。實際上,libtool也是簡單的調用 ld 和 lipo。'ld'被用來構建可執行檔,而libtool則用來構建 library 檔案。閱讀Daniel 和 Chris兩篇文章,可以瞭解到

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.