通常在情一般都不建議使用絕對路徑,因為寫死之后,換環境,換平台,又要重新修改路徑,因此常常使用相對路徑,哪么相對路徑通常使用的就是環境變量了。
在Mac 中,xcode 中build settings里面就有好多環境變量。
下面主要是以xcode 4.2 --sdk 5.0 進行說明,因為不同的環境build settings不一樣,但差別不大。
xcode 的build settings配置項有幾種設置
1、使用.xcconfig的方式進行配置
2、系統自薦的方式
3、自定義的方式
默認情況下,創建工程都是以自薦的方式,即默認已經設置好這些配置了。
哪怎么設置自定義方式呢?
xcode->Preferences->locations->advanced(高級)然后在下拉列表中選擇。
Derived Data Location (Recommended) ---系統自薦目錄
Locations Specified by Targets ---使用targets文件進行設置,即我們每次建項目的時候都會產生一個targets,通過targets中的選項進行設定輸出路徑。
因為構選輸出目錄跟這個設置有關,所以先介紹這個設置。
實例來說明其中的作用:
1、選創建一個演示項目。如圖:
存放目錄為/Users/ffsh/Desktop/CProjectSet,其中ffsh為登錄的用戶名。
2、當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