在編譯的時(shí)候需要附加的SDK。
支持的處理器架構(gòu)。不同的處理器對應(yīng)不同版本的iPhone。
高版本的iPhone可以運(yùn)行低版本的指令集。因此要適應(yīng)全系列的iPhone,Architectures應(yīng)選擇Armv6。
這決定了你的app所能支持的iOS最高版本。如果你選擇了iOS6.1,則你的app只能被iOS 6.1.X以下的系統(tǒng)安裝。Xcode默認(rèn)設(shè)置為能夠支持的最新版本。
Build Active Architecture Only
如果此項(xiàng)為YES,則在Xcode會(huì)根據(jù)設(shè)備的版本只將相應(yīng)的Architecture編譯入app。如連接了iPhone4進(jìn)行編譯,Build Active Architecture Only為YES,則編譯時(shí)只會(huì)構(gòu)建Armv7的二進(jìn)制文件。若連接的是iPhone5,則構(gòu)建出Armv7s的二進(jìn)制文件。
這個(gè)選項(xiàng)在Debug時(shí)默認(rèn)為YES,在Release時(shí)默認(rèn)為NO。這使得Debug時(shí)編譯的時(shí)間比Release快,更加方便調(diào)試。
app所支持的平臺(tái),有iOS和macOS,tvOS, watchOS四個(gè)選項(xiàng)。
app預(yù)期將要應(yīng)用到的架構(gòu)。默認(rèn)與Architectures的值相同。這個(gè)選項(xiàng)讓你可以在編譯的時(shí)候只打包Armv7s架構(gòu),但是兼容Armv6,Armv7。
產(chǎn)品文件和編譯中間文件的根目錄。產(chǎn)品文件和編譯時(shí)臨時(shí)文件都將放在這個(gè)目錄的子目錄中。
編譯時(shí)臨時(shí)文件的存放位置。編譯中間文件格式為product name+.build,如MyProduct.build。
Per-configuration Build Product Path
Directory path. Identifies the directory that holds temporary files for the active build configuration.
當(dāng)前編譯設(shè)置下的產(chǎn)品存放位置。
Per-configuration Intermediate File Path
Directory path. Identifies the directory that holds temporary files for the active build configuration.
當(dāng)前編譯設(shè)置下編譯時(shí)臨時(shí)文件的存放位置。
Precompiled Headers Cache Path
Directory path. Specifies the directory in which to place precompiled headers. Targets can share precompiled headers by specifying the same value for this build setting.
存放預(yù)編譯頭文件的位置。通過這個(gè)配置,Targets可以互相共享預(yù)編譯的頭文件。
Space-separated list of identifiers. Specifies the binary variants of the product. You can create additional variant names for special purposes. For example, you can use the name of a build configuration as a variant name to create highly customized binaries.
Values:
normal: Use to produce a normal binary.
profile: Use to produce a binary that generates profile information.
debug: Use to produce a binary with debug symbols, additional assertions, and diagnostic code.
此項(xiàng)可以設(shè)定生成產(chǎn)品的變種。您可以創(chuàng)建額外的產(chǎn)品變種作為特殊用途。例如,您可以使用編譯配置文件的名稱來創(chuàng)建一個(gè)高度定制的二進(jìn)制文件。
Build Variants的值有三個(gè):
normal-用于生成普通的二進(jìn)制文件
profile-用于可以生成配置信息的二進(jìn)制文件
debug-用于生成帶有debug標(biāo)志、額外斷言和診斷代碼的二進(jìn)制文件
選擇使用的編譯器。Xcode自帶有兩種選項(xiàng),Apple LLVM和LLVM GCC。建議使用默認(rèn)選項(xiàng)---Apple LLVM。
這個(gè)選項(xiàng)決定了記錄debug信息的文件格式。選項(xiàng)有DWARF with dSYM File和DWARF。建議選擇DWARF with dSYM File。DWARF是較老的文件格式,會(huì)在編譯時(shí)將debug信息寫在執(zhí)行文件中。
是否生成配置代碼。默認(rèn)選擇NO。
Precompiled Header Uses Files From Build Directory
預(yù)編譯build路徑中的頭文件。由于編譯過程比較耗時(shí),且兩次編譯之間未必會(huì)改動(dòng)所有文件。因此將不會(huì)改動(dòng)的常用文件保留成預(yù)編譯文件將大大減少編譯時(shí)的時(shí)間。建議這一項(xiàng)選擇YES。
運(yùn)行靜態(tài)分析器。
Scan All Source Files for Includes
掃描include文件所包含的所有源文件。
這個(gè)選項(xiàng)決定了是否在編譯的時(shí)候進(jìn)行驗(yàn)證。驗(yàn)證的內(nèi)容和app
store的審查內(nèi)容一致。默認(rèn)選項(xiàng)是debug時(shí)不驗(yàn)證,release時(shí)驗(yàn)證,這樣就保證了每個(gè)release版本都會(huì)通過validate,讓被拒的風(fēng)險(xiǎn)在提交app
store之前就暴露出來,減少損失。
注意:
1. 這個(gè)選項(xiàng)只在連接真機(jī)的時(shí)候有效。在使用模擬器時(shí)無效。不過我用真機(jī)試了一下,似乎也沒有檢查出代碼里的私有API。
2. 想手動(dòng)validate,可以在Organizer->Archives里找到需要檢查的Archive,點(diǎn)擊Validate按鈕即可。這樣檢查似乎靠譜些,可以查出私有API等違規(guī)操作。
build成功后的,最終產(chǎn)品路徑--可以在Build Settings參數(shù)的Per-configuration Build Products Path項(xiàng)里設(shè)置$(TARGET_NAME)
目標(biāo)工程名稱
$(SRCROOT)
工程文件(比如Nuno.xcodeproj)的路徑?
$(CURRENT_PROJECT_VERSION)
當(dāng)前工程版本號
其他:
當(dāng)編譯靜態(tài)庫,設(shè)備選模擬器(iPhone 5.0 Simulator),未設(shè)置任何Build Settings參數(shù)時(shí),默認(rèn)的基礎(chǔ)路徑:
/Users/xxx/Library/Developer/Xcode/DerivedData/xxxWorkspace-caepeadwrerdcrftijaolkkagbjf
下面用$()代替上面一長串東東
$(SYMROOT) =$()/Build/Products
=?$()/Build/Products
$(BUILD_ROOT) =$()/Build/Products
這三個(gè)變量中的$()不會(huì)隨著Build Settings參數(shù)的設(shè)置而改變
相反,以下可以通過設(shè)置而改變
$(CONFIGURATION_BUILD_DIR) =$()/Build/Products/Debug-iphonesimulator
$(BUILT_PRODUCTS_DIR) =$()/Build/Products/Debug-iphonesimulator
$(CONFIGURATION_TEMP_DIR) =$()/Build/Intermediates/UtilLib.build/Debug-iphonesimulator
$(TARGET_BUILD_DIR) =$()/Build/Products/Debug-iphonesimulator
$(SDK_NAME) = iphonesimulator5.0
$(PLATFORM_NAME) = iphonesimulator
$(CONFIGURATION) = Debug
$(TARGET_NAME) = UtilLib
$(EXECUTABLE_NAME) = libUtilLib.a 可執(zhí)行文件名
${IPHONEOS_DEPLOYMENT_TARGET} 5.0
$(ACTION) = build
$(CURRENTCONFIG_SIMULATOR_DIR) 當(dāng)前模擬器路徑
$(CURRENTCONFIG_DEVICE_DIR) 當(dāng)前設(shè)備路徑
$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME =
$()/Build/Products/Debug-iphonesimulator
$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) =$()/Build/Intermediates/UtilLib.build/Debug-iphonesimulator
自定義變量
${CONFIGURATION}-iphoneos 表示:Debug-iphoneos
${CONFIGURATION}-iphonesimulator?表示:Debug-iphonesimulator
$(CURRENTCONFIG_DEVICE_DIR) =${SYMROOT}/${CONFIGURATION}-iphoneos
$(CURRENTCONFIG_SIMULATOR_DIR) =${SYMROOT}/${CONFIGURATION}-iphonesimulator
自定義一個(gè)設(shè)備無關(guān)的路徑(用來存放各種架構(gòu)arm6/arm7/i386輸出的產(chǎn)品)
$(CREATING_UNIVERSAL_DIR) =${SYMROOT}/${CONFIGURATION}-universal
自定義變量代表的值
$(CURRENTCONFIG_DEVICE_DIR) =$()/Build/Products/Debug-iphoneos
$(CURRENTCONFIG_SIMULATOR_DIR) =$()/Build/Products/Debug-iphonesimulator
$(CREATING_UNIVERSAL_DIR) =$()/Build/Products/Debug-universal
iphoneos5.0下的編譯腳本:
xcodebuild -project "UtilLib.xcodeproj"?-configuration "Debug" -target "UtilLib" -sdk "iphoneos5.0" -arch "armv6 armv7" build RUN_CLANG_STATIC_ANALYZER=NO$(BUILD_DIR)="${BUILD_DIR}"?BUILD_ROOT="${BUILD_ROOT}"
iphonesimulator5.0下的編譯腳本:
xcodebuild -project "UtilLib.xcodeproj"?-configuration "Debug" -target "UtilLib" -sdk "iphonesimulator5.0" -arch "i386" build RUN_CLANG_STATIC_ANALYZER=NO$(BUILD_DIR)="${BUILD_DIR}"??BUILD_ROOT="${BUILD_ROOT}"
加上下面一句表示輸出到文件:
> "${BUILD_ROOT}.build_output"
lipo腳本工具:合并iPhone模擬器和真機(jī)的靜態(tài)類庫,生成通用庫
lipo -create -output?"${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_DEVICE_DIR}/${EXECUTABLE_NAME}" ? ? ? ??"${CURRENTCONFIG_SIMULATOR_DIR}/${EXECUTABLE_NAME}"
意思是:把"${CURRENTCONFIG_DEVICE_DIR}目錄下的.a文件,和${CURRENTCONFIG_SIMULATOR_DIR}目錄下的.a文件合并,
在${CREATING_UNIVERSAL_DIR}目錄下,生成兩個(gè)設(shè)備都通用的靜態(tài)庫,
例如:lipo -create -output xy.a x.a y.a
二、xcode4中build Settings常見參數(shù)解析
1.Installation Directory:安裝路徑
靜態(tài)庫編譯時(shí),在Build Settings中Installation Directory設(shè)置“$(BUILT_PRODUCTS_DIR)”
Skip Install設(shè)為YES
Installation Directory默認(rèn)為/usr/local/lib
因?yàn)锽uild Location默認(rèn)時(shí),.a文件會(huì)放在很長(比如:/Users/xxx/Library/Developer/Xcode/DerivedData/xxxProgram
dalrvzehhtesxdfqhxixzafvddwe/Build/Products/Debug-iPhoneos)的路徑下,或是我們target指定的路徑
Skip Install如果是NO,可能會(huì)被安裝到默認(rèn)路徑/usr/local/lib
2.Public Headers Folder Path:對外公開頭文件路徑
設(shè)為“include”(具體的頭文件路徑為:$(BUILT_PRODUCTS_DIR)/include/xx.h)
在最終文件.a同級目錄下生成一個(gè)include目錄
默認(rèn):/usr/local/include
Public Headers Folder Path這個(gè)路徑就是使用這lib的某工程需要依賴的外部頭文件.導(dǎo)入這路徑后,#include/import "xx.h"才能看到
3.User Header Search Paths:依賴的外部頭文件搜索路徑
設(shè)置為“$(BUILT_PRODUCTS_DIR)/include”
和2中路徑對應(yīng)
4.Per-configuration Build Products Path:最終文件路徑
比如設(shè)為“../app”,就會(huì)在工程文件.xcodeproj上一層目錄下的app目錄里,創(chuàng)建最終文件
默認(rèn)為$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
等于$(BUILT_PRODUCTS_DIR)
5.Per-configuration Intermediate Build Files Path:臨時(shí)中間文件路徑
默認(rèn)為:$(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
6.Code Signing Identity:真機(jī)調(diào)試的證書選擇
選一個(gè)和Bundle identifier相對應(yīng)的證書
Library Search Paths:庫搜索路徑
Architectures:架構(gòu),設(shè)為 armv6 或 armv7
Valid?Architectures:應(yīng)用框架,可以設(shè)為?armv6、?armv7 或i386
Product Name:工程文件名,默認(rèn)為$(TARGET_NAME)
Info.plist File:info文件路徑
Build Variants:默認(rèn)為normal
Other Linker Flags:其他鏈接標(biāo)簽
設(shè)為“-ObjC”
當(dāng)導(dǎo)入的靜態(tài)庫使用了類別,需要設(shè)為-ObjC
iOS Deployment Target:ios部署對象
比如可以選擇設(shè)為,ios3到ios5的一種版本
Prefix Header:預(yù)編頭文件(比如:UtilLib/UtilLib-Prefix.pch)
Precompile?Prefix Header:設(shè)為“Yes”,表示允許加入預(yù)編譯頭