一般在情通常都不建議使用絕對路徑,由於寫死以後,換環境,換平臺,又要從新修改路徑,所以經常使用相對路徑,哪麼相對路徑一般使用的就是環境變量了。xcode
在Mac 中,xcode 中build settings裏面就有好多環境變量。iphone
下面主要是以xcode 4.2 --sdk 5.0 進行說明,由於不一樣的環境build settings不同,但差異不大。工具
xcode 的build settings配置項有幾種設置ui
一、使用.xcconfig的方式進行配置spa
二、系統自薦的方式code
三、自定義的方式ip
默認狀況下,建立工程都是以自薦的方式,即默認已經設置好這些配置了。ci
哪怎麼設置自定義方式呢?get
xcode->Preferences->locations->advanced(高級)而後在下拉列表中選擇。io
Derived Data Location (Recommended) ---系統自薦目錄
Locations Specified by Targets ---使用targets文件進行設置,即咱們每次建項目的時候都會產生一個targets,經過targets中的選項進行設定輸出路徑。
由於構選輸出目錄跟這個設置有關,因此先介紹這個設置。
實例來講明其中的做用:
一、選建立一個演示項目。如圖:
存放目錄爲/Users/ffsh/Desktop/CProjectSet,其中ffsh爲登陸的用戶名。
二、當xcode->Preferences->locations->advanced 中選擇爲Derived Data Location (Recommended) 時:
Derived data有三種選擇如圖:
a、當選擇爲default時,Derived Data的目錄爲 /Users/xxx/Library/Developer/Xcode/DerivedData
b、當選擇爲Relative時,Derived Data的目當爲 當前.xcodeproj所在的目錄。見圖:
c、當選擇爲custom,即自定義,爲了查看是否輸出到自定義,我在Desktop下建了一個custom文件夾,而後設置Custom的輸出路徑爲:/Users/ffsh/Desktop/Custom
一樣能夠把原來Derived Data下的東東所有輸出到了custom。
上面是自薦的方式。
當xcode->Preferences->locations->advanced 中選擇爲Locations Specified by Targets時:
先來設置一下Build Products Path 中的值(默認爲Build),這裏取爲myBuild.
而後分別將Derived Data設爲:
a、default時,產生的mybuild 目錄在.xcodeproj目錄。
能夠看到原來Derived Data目錄下不現產生Build的文件夾了,些文件夾被放到了.xcodeproj目錄。
b、Relative時,mybuild目錄不變,但Derived Data目錄放到了xcodeproj目錄了。
c、custom時,把Derived data下的內容放到了custom目錄。
若是Build Products Path 中的值爲mybuild,但仍是自薦方式的話,此時mybuild是不起做用的。
事實上,從上面你們能夠知道,build出來的內容包括兩個,一個是正式的,一個是臨時的。能夠在自薦的放式下看到
Build下有四個文件夾分別爲:
filemaps
intermediates --編譯中間產生的文件(temp)
precompileheaders
products --編譯最終產生的文件。
設置Build Products Path路徑,實際上是把products中的內容放到這個路徑下。
設置Intermediates Build files path ,實際上是把intermediates中的內容放到這個目錄下。
Build Locations中的4個設置項的值:
默認狀況下的
如下用$(default) 代替 /Users/xxx/Library/Developer/Xcode/DerivedData/CProjectSet-erpfssifqoxezbcceyoqjoclrfds
$(SYMROOT) = $(default)/Build -- 對應於Build Products Path設置,若是爲自薦方式,這個值填了無效果,若是爲使用targets配置方式這裏填的才起效果
$(SYMROOT)/intermediates ----中間構建文件存放路徑,其中在Intermediates Build files path中只須要設爲$(SYMROOT)便可,intermediates系統自動生成。
$(BUILD_DIR) = $(SYMROOT)/products
$(BUILD_ROOT) = $(BUILD_DIR)
$(CONFIGURATION) 當項目Build時選譯Build configuration爲Debug時值爲Debug,當選爲Release時,值爲Release
$(EFFECTIVE_PLATFORM_NAME) 當模似器時爲值爲-iphonesimulator 當爲真機時爲-iphoneos
$(PROJECT_TEMP_DIR) = $(SYMROOT)/intermediates/xxxx.build 基中xxxx表過項目名稱
$(CONFIGURATION_BUILD_DIR) = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) ---- (Per-Configuration Build Products Path)
$(CONFIGURATION_TEMP_DIR) = $(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) --(Per-Configuration Intermediate File Path)
自定義的狀況下:
$(SYMROOT) = $(SRCROOT)/abc --- 其中abc爲本身在Build Products Path中設置的值
$(BUILD_DIR) = $(SYMROOT)
$(BUILD_ROOT) = $(BUILD_DIR)
$(PROJECT_TEMP_DIR) = $(SYMROOT)/xxxx.build
經過自定義能夠自行設定構建目錄,便於管理。
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模擬器和真機的靜態類庫,生成通用庫
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}目錄下,生成兩個設備都通用的靜態庫,
例如:lipo -create -output xy.a x.a y.a