最近在做SDK兼容性測(cè)試發(fā)現(xiàn)一個(gè)問題,就是編譯出來的SDK蕾总,在iOS8以下的系統(tǒng)中不能用粥航。查了下,發(fā)現(xiàn)是編譯設(shè)置錯(cuò)了生百,雖然我target設(shè)置的是支持iOS6以上的躁锡,但是工程設(shè)置的還是iOS8以上。xib文件編譯的版本是根據(jù)project設(shè)置置侍,而不是target,這個(gè)也是為什么在低于iOS8中不能用的原因拦焚。正好之前對(duì)SDK開發(fā)進(jìn)行了工程拆分和重組蜡坊,也使用了workspace,順便也了解了些編譯相關(guān)的東西赎败。
Xcode Project
Xcode中的 project里面包含了所有的源文件秕衙,資源文件和構(gòu)建一個(gè)或者多個(gè)product的信息。project利用他們?nèi)ゾ幾g我們所需的product僵刮,也幫我們組織它們之間的關(guān)系据忘。一個(gè)project可以包含一個(gè)或者多個(gè)target鹦牛。project定義了一些基本的編譯設(shè)置,每個(gè)target都繼承了project的默認(rèn)設(shè)置勇吊,每個(gè)target可以通過重新設(shè)置target的編譯選項(xiàng)來定義自己的特殊編譯選項(xiàng)曼追。
project包含了以下信息:
-
源文件
- 代碼的頭文件和實(shí)現(xiàn)文件
- 靜態(tài)庫(kù),動(dòng)態(tài)庫(kù)汉规,
- 資源文件(如文本礼殊,xml,plist等)
- 圖片資源
- 界面資源文件(xib针史, storyboard等)
在文件結(jié)構(gòu)的導(dǎo)航中晶伦,采用group去組織文件(實(shí)際開發(fā)中,盡量使用實(shí)體文件夾)
project的編譯級(jí)別配置文件如(debug啄枕, release)
target
運(yùn)行環(huán)境如:debug婚陪,test
project可以單獨(dú)存在,或者存在于一個(gè)workspace中频祝。
target
target定義了構(gòu)造一個(gè)product所需的文件和編譯指令泌参。一個(gè)target對(duì)應(yīng)于一個(gè)product。target說白了就是
告訴編譯系統(tǒng)要編譯的文件和編譯設(shè)置智润。編譯指令就是根據(jù)build settings and build phases來確定的及舍。
target之間可以進(jìn)行依賴。如果一個(gè)target的編譯需要另外一個(gè)target作為他的輸入窟绷,那么我們就可以說前者依賴于后者锯玛。如果這兩個(gè)target在同一個(gè)workspace里面,Xcode可以發(fā)現(xiàn)他們的依賴關(guān)系兼蜈,這種依賴稱之為隱式依賴攘残。當(dāng)然你可以通過設(shè)置,明確他們的依賴關(guān)系为狸。
workspace
workspace是Xcode的一種文件歼郭,用來管理工程和里面的文件,一個(gè)workspace可以包含若干個(gè)工程辐棒,甚至可以添加任何你想添加的文件病曾。workspace提供了工程和工程里面的target之間隱式和顯式依賴
關(guān)系,用來管理和組織工程里面的所有文件漾根。
workspace中的工程共享一個(gè)編譯目錄
workspace中的工程默認(rèn)都是在同一個(gè)編譯目錄下泰涂,也就是workspace的編譯目錄。由于每個(gè)工程中的文件都在workspace的編譯目錄下辐怕,所以每個(gè)工程之間的文件都是相互可以引用的逼蒙。因此,如果workspace中的多個(gè)工程使用了同一個(gè)庫(kù)的時(shí)候寄疏,我們就不需要給每個(gè)工程都拷貝一個(gè)是牢。
Xcode會(huì)檢查編譯目錄里面的所有文件去發(fā)現(xiàn)隱式的依賴關(guān)系僵井。比如,一個(gè)工程用來編譯成庫(kù)給其他工程去引用驳棱,Xcode可以自動(dòng)的先編譯這個(gè)工程的庫(kù)批什,然后再去編譯其他的工程。雖然你沒有在編譯選項(xiàng)里面去設(shè)置這些依賴關(guān)系蹈胡。當(dāng)然如果你真的需要的話渊季,你也可以去設(shè)置,提供一個(gè)顯式的編譯依賴關(guān)系罚渐。
workspace中每個(gè)工程依然都是獨(dú)立的却汉。如果你想單獨(dú)的使用這個(gè)工程,并且不希望影響其他工程荷并,或者被其他工程影響合砂,你可以直接打開工程而不通過workspace。一個(gè)工程可以被多個(gè)workspace所擁有源织,在任意的組合中依然可以直接運(yùn)行翩伪,而不需要去重新配置工程或者workspace。
Xcode Scheme
scheme定義了編譯集合中的若干target谈息,編譯時(shí)的一些設(shè)置以及要執(zhí)行的測(cè)試集合缘屹。我們可以定義多個(gè)scheme,但是每次只能使用其中一個(gè)侠仇。我們可以設(shè)置scheme保存在project中還是workspace中轻姿。如果保存在project中,那么任意包含了這個(gè)工程的workspace都可以使用逻炊。如果保存在workspace中互亮,那么只有這個(gè)workspace可以使用。
參考:官方文檔