国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Xcode編譯流程

這篇具有很好參考價值的文章主要介紹了Xcode編譯流程。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?
Xcode的構(gòu)建過程本質(zhì)上是執(zhí)行一系列構(gòu)建任務(wù)。如:代碼檢測,編譯代碼,鏈接目標文件,拷貝資源(圖片, plist, nib)文件,代碼簽名等。大部分任務(wù)是執(zhí)行命令行工具,如(clang編譯、 ld鏈接、 codesign簽名, altool上傳)。這些工具使用xcode項目的配置信息,根據(jù)特定的順序執(zhí)行。bulid System的工作就是創(chuàng)建構(gòu)建任務(wù),并協(xié)調(diào)這些任務(wù)按照正確的順序執(zhí)行。
構(gòu)建任務(wù)的順序是任務(wù)之間的依賴關(guān)系定的。
如有2個類文件,A文件和B文件, B文件使用了A文件的方法,引入了A文件。那么他們的編譯任務(wù)是編譯A,再編譯B,等都編譯好,將兩個.o文件進行鏈接。
?
我們每次構(gòu)建項目是對一個具體的 Target發(fā)起的,每個Target擁有自己的文件和編譯規(guī)則,在項目里可以存在多個子項目,這導(dǎo)致了在編譯的時候如果使用了 Cocoapods 或者擁有多個 target 的項目會先編譯依賴庫,然后再編輯當前項目。
如果使用的workspace開發(fā),會遍歷里面管理的項目,找到Target的依賴進行編譯,然后再編譯當前項目。這些依賴庫的Target的編譯過程和我們項目的編譯流程是一樣的。

Xcode編譯流程
編譯準備階段
1.創(chuàng)建編譯計劃,檢查依賴: 檢查當前項目中使用的依賴庫是否已經(jīng)安裝并能夠被正確地引用;確定編譯順序,
如工程A下有子工程B,類C中引用了類D,要根據(jù)依賴關(guān)系創(chuàng)建編譯計劃,先編譯獨立的類,子項目;再編譯有依賴的類和主項目。
2.創(chuàng)建構(gòu)建產(chǎn)物過程中和結(jié)束時需要的目錄
Xcode編譯流程
?
編譯階段
1.寫輔助文件:創(chuàng)建app包目錄,后面編譯后的文件都會被放入app包目錄中;將項目的文件結(jié)構(gòu)寫成.hmap映射文件,方便后面引用查詢使用;
生成.hmap文件:當編譯器處理.h文件時,它會生成一個.hmap文件,包含了所有的.h文件及其對應(yīng)的目標文件的信息。這些信息將被用來加速下一次編譯過程。.hmap文件通常被存儲在Derived Data目錄下。
2.運行預(yù)設(shè)腳本:Cocoapods 會預(yù)設(shè)一些腳本,當然你也可以自己預(yù)設(shè)一些腳本來運行。這些腳本都在 Build Phases 中可以看到;【'[CP] Check Pods Manifest.lock','Copy Pods Resources'】
Xcode編譯流程

3.編譯文件:針對每一個文件進行編譯,先編譯.Swift后編譯.m文件,可以查看每個文件的編譯時間以及error和warning。
編譯源碼文件是編譯階段的重點,它會生成 Mach-O類型的.o文件。這過程涉及到了 LLVM三相設(shè)計的 的完整流程:編譯前端、優(yōu)化器、編譯后端。
4.鏈接文件:將項目中的多個可執(zhí)行文件合并成一個文件;鏈接分為動態(tài)鏈接和靜態(tài)鏈接,這2項也是程序員必須要面對的2個重要概念,這個原理衍生了很多重要的應(yīng)用場景,如:iOS原生代碼的熱更新,啟動性能優(yōu)化,APP瘦身的符號剪裁等。
5.拷貝資源文件:將項目中的資源文件拷貝到目標app包;

6.編譯,鏈接 storyboard 文件:storyboard 文件也是會被編譯的;項目中的 storyboard 會被編譯成一個二進制文件,包含了界面的所有信息和結(jié)構(gòu),這個文件的后綴名為 .storyboardc。.storyboardc 文件會在鏈接階段被鏈接到最終的應(yīng)用程序中,以展示應(yīng)用程序的用戶界面。
7.編譯 xib 文件:。 xib 文件會先解析成 XML 格式的文件,然后編譯成二進制格式的文件,即 nib 文件。編譯后的 nib 文件會被打包到應(yīng)用程序的 bundle 中。
8.編譯 Asset 文件:我們的圖片如果使用 Assets.xcassets 來管理圖片,那么這些圖片將會被編譯成機器碼,除了 icon 和 launchImage;

9.運行 Cocoapods 腳本:將在編譯項目之前已經(jīng)編譯好的依賴庫和相關(guān)資源拷貝到包中。
10.將 Swift 標準庫拷貝到包中
Xcode編譯流程

11.生成 .app 包
12.對包進行簽名
13.完成打包

XCode中項目的結(jié)構(gòu)關(guān)系
Target:表示一種產(chǎn)物類型,它有很多設(shè)置可以做細節(jié)修改,如:Build Settings, Build Phases, Build Rules。
Configuration: 構(gòu)建變體,如每個Target下默認就有2個構(gòu)建變體Debug, Release。 這2個構(gòu)建變體的設(shè)置內(nèi)容都可以進行修改,如Deubeg下不產(chǎn)生DSYM符號文件加速編譯,Release下產(chǎn)生DSYM符號文件用于排查線上問題。
Scheme:產(chǎn)物生成驅(qū)動器,定義了產(chǎn)物生成的組成過程,Target和Configuaration是靜態(tài)的配置定義,Scheme是對這些定義的消費。
Project:是直接容器,它直接管理者代碼文件,資源文件,腳本文件等。它可以引入其他Project作為它的依賴。
WorkSpace: 它是管理Project的項目容器,在它下面管理的Project可以通過依賴而使用,如A,B是WorkSpace下的兩個Project, A在它的Frameworks,Libraries..下點擊“+”添加B的產(chǎn)物就可以使用了。如果使用cocopods時,這些會被自動做。

編譯性語言與解釋性語言
解釋性語言:邊解釋邊運行。特點是調(diào)試快,運行慢。
解釋器在運行的時候把代碼逐行做詞法分析,語法分析,語義分析,生成可執(zhí)行的中間碼,然后執(zhí)行中間碼。
編譯性語言:先編譯成可以在CPU上直接運行的機器碼,再執(zhí)行。特點是運行快,調(diào)試慢。
通過編譯器(采用三相設(shè)計:編譯器前端,LLVM IR中間碼優(yōu)化器,編譯器后端),將代碼字符串做詞法分析,語法分析,語義分析,生成中間碼IR。
然后把IR中間碼交給優(yōu)化器做優(yōu)化。
IR優(yōu)化器處理完后把結(jié)果交給編譯器后端編譯成不同架構(gòu)(arm64, i386)的可執(zhí)行文件。

三相設(shè)計
假如有N種語言(C、OC、C++、Swift…)的前端,同時也有M個架構(gòu)(模擬器、arm64、x86…)的Target,是否就需要 N × M 個編譯器?
三相架構(gòu)的價值就體現(xiàn)出來了,通過共享優(yōu)化器的中轉(zhuǎn),很好的解決了這個問題。
假如你需要增加一種語言,只需要增加一種前端;假如你需要增加一種處理器架構(gòu),也只需要增加一種后端,而其他的地方都不需要改動。

LLVM的組成
在Xcode編譯iOS項目的時候,都是使用的LLVM,其實在編寫代碼以及調(diào)試的時候都在接觸LLVM提供的功能,例如:代碼的亮度(Clang)、實時代碼檢查(Clang)、代碼提示(Clang)、debug斷點調(diào)試(LLDB)。
LLVM項目是模塊化和可重用的編譯器和工具鏈技術(shù)的集合。LLVM主要的子項目有一下幾個:
1.LLVM核心庫:
LLVM提供一個獨立的鏈接代碼優(yōu)化器,為許多流行CPU(以及一些不太常見的CPU)的代碼生成支持。
這些庫是圍繞一個指定良好的代碼表示構(gòu)建的,稱為LLVM中間表示(“LLVM IR”)。
LLVM還可以充當JIT編譯器 - 它支持x86 / x86_64和PPC / PPC64程序集生成,并具有針對編譯速度的快速代碼優(yōu)化。
2.LLVM IR 生成器Clang:
Clang是LLVM的一個前端,它是LLVM的C / C ++ / Objective-C編譯器,旨在提供驚人的快速編譯(例如,在調(diào)試配置中編譯Objective-C代碼時比GCC快3倍),非常有用的錯誤和警告消息以及提供構(gòu)建優(yōu)秀源代碼工具的平臺。
3.LLDB項目:
LLDB項目以LLVM和Clang提供的庫為基礎(chǔ),提供了一個出色的本機調(diào)試器。它使用Clang AST和表達式解析器,LLVM JIT,LLVM反匯編程序等,以便提供“正常工作”的體驗。在加載符號時,它也比GDB快速且內(nèi)存效率更高。
4.lld項目:
lld項目旨在成為clang / llvm的內(nèi)置鏈接器。目前,clang必須調(diào)用系統(tǒng)鏈接器來生成可執(zhí)行文件。



參考文章:

https://blog.csdn.net/dangyalingengjia/article/details/103336421
https://blog.csdn.net/Future_One/article/details/81882359
http://chuquan.me/2021/02/16/understand-ios-xcode-build-process/
https://xilankong.github.io/ios開發(fā)基礎(chǔ)/2020/07/29/Xcode-build過程都做了什么.html

?文章來源地址http://www.zghlxwxcb.cn/news/detail-428286.html

到了這里,關(guān)于Xcode編譯流程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • vue執(zhí)行配置選項npm run serve的本質(zhì)

    vue執(zhí)行配置選項npm run serve的本質(zhì)

    目錄 vue執(zhí)行配置選項npm run serve運行開發(fā)服務(wù)器的本質(zhì) 一、啟動開發(fā)服務(wù)器、調(diào)用“工具鏈”、編譯、并運行當前工程 二、npm?run serve內(nèi)部原理分析 三、vue編譯運行過程 喜歡的,就收藏并點個贊,便于觀看下篇文章: npm run serve ? ? ? ? 該命令的配置文件在當前工程的pack

    2024年01月21日
    瀏覽(20)
  • 本質(zhì)矩陣(Essential Matrix)E進行分解的過程

    本質(zhì)矩陣(Essential Matrix)E進行分解的過程

    分解本質(zhì)矩陣的過程遵循以下步驟: 使用奇異值分解(SVD)計算本質(zhì)矩陣E的分解。SVD分解是一種將矩陣分解為三個矩陣的乘積的方法,它的形式為 E = UΣV^T,其中U和V是正交矩陣,Σ是對角矩陣。此步驟的結(jié)果存儲在u、w和vt中。 把U矩陣的第三列復(fù)制到t,并進行歸一化。t代表

    2024年02月15日
    瀏覽(18)
  • IDE /完整分析C4819編譯錯誤的本質(zhì)原因

    IDE /完整分析C4819編譯錯誤的本質(zhì)原因

    本文將從根本原因上來分析和解決 “C4819” 編譯告警問題?!癈4819: 該文件包含不能在當前代碼頁(936)中表示的字符,請將該文件保存為Unicode格式以防止數(shù)據(jù)丟失”。 使用 QtCreator + MSVC 編譯器組成的集成開發(fā)環(huán)境時,若不合理配置IDE編輯器和編譯器的文件編碼格式選項,則很

    2024年02月15日
    瀏覽(17)
  • Xcode 15 編譯出錯問題解決

    Xcode 15 編譯出錯問題解決

    正常升級xcode 15以后發(fā)現(xiàn)原來沒有出現(xiàn)報錯的代碼,現(xiàn)在出現(xiàn)了編譯錯誤。(如果沒有出現(xiàn)請忽略)下面教你如何解決這個問題。 1、pod update更新cocoapods,因為其根據(jù)xcode15做了很多的更新,保證cocoapods是最新的。 千萬別去管Pods.xcodeproj 和我們自己工程出現(xiàn)的設(shè)置類的警告,不

    2024年02月03日
    瀏覽(16)
  • 深度挖掘.c到.exe的整個過程,透過現(xiàn)象看本質(zhì)

    深度挖掘.c到.exe的整個過程,透過現(xiàn)象看本質(zhì)

    在ANSI C的任何一種實現(xiàn)中,存在兩個不同的環(huán)境。 第1種是翻譯環(huán)境,在這個環(huán)境中源代碼被轉(zhuǎn)換為可執(zhí)行的機器指令。 從 .c 到.exe的過程中需要依賴翻譯環(huán)境 第2種是執(zhí)行環(huán)境,它用于實際執(zhí)行代碼 編譯過程其實又被細分為三個環(huán)節(jié),即預(yù)編譯,編譯和匯編 組成一個程序的

    2024年02月03日
    瀏覽(17)
  • Xcode編譯速度慢是什么原因?如何提高編譯速度?

    Xcode編譯速度慢是什么原因?如何提高編譯速度?

    Hello各位伙伴們好,我是咕嚕鐵蛋!作為一個開發(fā)者,我們都希望能夠高效地開發(fā)應(yīng)用程序,而編譯速度是影響開發(fā)效率的重要因素之一。然而,有時候我們會發(fā)現(xiàn)在使用 Xcode 進行開發(fā)時,編譯速度非常慢,這給我們帶來了不少困擾。那么,為什么 Xcode 的編譯速度會變慢?有

    2024年02月04日
    瀏覽(23)
  • Xcode 14打包flutter 的項目構(gòu)建失敗

    Xcode 14打包flutter 的項目構(gòu)建失敗

    升級xcode 后flutter項目構(gòu)建失敗 起因: 升級Xcode 到新的14.3.1版本 錯誤: showing recent issues command phasescriptexecution failed with a nonzero exit code 這個錯誤很多情況下都會出現(xiàn),所以參考價值較低。 解決: 嘗試以前的常規(guī)操作,flutter clean ; flutter pub get 命令清理項目緩存, 然后配合

    2024年02月12日
    瀏覽(22)
  • xcode 開發(fā)者證書創(chuàng)建流程

    xcode 開發(fā)者證書創(chuàng)建流程

    一、Certificates 開發(fā)者證書(分為開發(fā)證書和發(fā)布證書,類型為ios Development,ios Distribution),這個是最基礎(chǔ)的,不論是真機調(diào)試,還是上傳到appstore都是需要的,是一個基證書,用來證明自己開發(fā)者身份的;(開發(fā)證書與發(fā)布證書的數(shù)量都有限制, 目前發(fā)現(xiàn)只能手動申請一次) 二、

    2024年02月09日
    瀏覽(27)
  • Xcode 15(iOS17)編譯適配報錯

    Xcode 15(iOS17)編譯適配報錯

    報錯:No template named \\\'unary_function\\\' in namespace \\\'std\\\'; did you mean \\\'__unary_function\\\'?? 解決: Xcode點擊Pods點擊Build Settings點擊 Basic找到Apple Clang-Preprocessing下的Preprocessor Macros? 添加:_LIBCPP_ENABLE_CXX17_REMOVED_UNARY_BINARY_FUNCTION

    2024年03月17日
    瀏覽(31)
  • XCode升級后QT無法編譯的問題

    原因是SDK的版本變了,Qt配置的版本要修改。 解決辦法如下: 1.找到 /Users/*/Qt/5.15.2/clang_64/mkspecsqdevice.pri 這個文件打開編輯, 在文件末尾追加一句 !host_build:QMAKE_MAC_SDK=macosx13.1 至于這個版本號13.1是怎么來的呢? /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDK

    2024年02月14日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包