近日閒來無事,與博客園中閒蕩,忽至一煙霞照耀祥瑞蒸熏松竹翠秀奇花遍開的神奇之地。如此美景,令人心生向往,故而徜徉於其中不可自拔,獨樂樂不如眾樂樂:
iOS開發之 相對路徑與絕對路徑
https://developer.apple.com/library/mac/documentation/DeveloperTools/Reference/XcodeBuildSettingRef/1-Build_Setting_Reference/build_setting_ref.html
在iOS的工程中,尤其是在使用CocoaPods前,經常會把某個靜態庫或者Framework直接拖到工程中,編譯運行通過,這樣就可以了麼? 一般我們在xcode裡面配置包含工程目錄下頭文件的時候,都要關聯著相對路徑和絕對路徑,如果只是自己用這個項目,用絕對路徑的問題不大,但是如果你把工程發給別人,別人就要在改這個絕對路徑,這時候絕對路徑的缺點立馬出現。
XCode用戶可以 通過Header Search Paths 來配置環境變量。但這裡涉及到一個另外一個參數 User Header Search Paths, 這兩者到底有什麼區別呢?
首先明確一點,Header Search Paths 顧名思義就是用來存放 Project 中頭文件的搜索根源,沒有被add到項目裡的頭文件,可以通過配置Header Search Paths 來引入頭文件,這樣的好處可以不讓project 包含的文件太多,便於管理。
淺顯一點的區別是,編碼時候通過 #include 引入頭文件的方式有兩種 <> 和 ""。<> 是只從 Header Search Paths 中搜索, 而 "" 則能從 Header Search Paths 和 User Header Search Paths 中搜索。換言之 ,假如你把 路徑加到 User Header Search Paths 中,那麼 你用 #include
具體一點的區別是,<> 是從系統目錄空間 (對應 Header Search Paths)中搜索文件, "" 是從用戶目錄空間(對應 User Header Search Paths)中搜索文件。如果你把路徑加到 User Header Search Paths 中,而 <> 無法從系統目錄空間中找到新加的路徑,從而報錯。
所以在修改User Header Search Paths這個選項的時候使用
"$(SRCROOT)/當前工程名字/需要包含頭文件所在文件夾"
將上面的雙引號裡面的字符串拷貝之後,你會發現這個“$(SRCROOT)”,會自動變成當前工程所以的目錄。
這樣就可以了,發給別人,別人也不用在去修改路徑了。
1.c/c++頭文件引用問題
include <> 引用編譯器的類庫路徑下的頭文件
include “” 引用工程目錄的相對路徑的頭文件
include 是編譯指令,在編譯時,編譯器會將相對路徑替換成絕對路徑,因此,頭文件絕對路徑=搜索路徑+相對路徑。
Xcode Build Settings 下 Search Paths設置搜索路徑
Header Search Paths:頭文件搜索路徑設置
$(SRCROOT)宏和$(PROJECT_DIR)宏都指xxx.xcodeproj所在的父目錄
例如:引用工程testDemo/scr/test.h 頭文件,
Header Search Paths中添加$(SRCROOT),引用為include “scr/test.h"
如果在Header Search Paths中添加$(SRCROOT)/scr,那麼頭文件引用直接引用 include “test.h”
1.
$(inherited) "$(SRCROOT) 修改.a文件的路徑 --Library Search Paths
$(inherited) "$(SRCROOT)/.a文件所在的文件名"
//如果有多個.a文件格式就像這樣
$(inherited) "$(SRCROOT)/xxxx" "$(SRCROOT)/xx"
如果取的是相對是絕對路徑那麼工程移到別的地方就有可能導致運行出錯。所以要改成相對路徑
2.
Other Linker Flags:其他鏈接標簽
設為“-ObjC”
當導入的靜態庫使用了類別,需要設為-ObjC