from:http://www.cnblogs.com/perryxiong/p/3759818.html
最近我在項目中遇到一些工程之間的管理問題。
模型:
其中 庫A 是一個公共的基礎靜態庫, M_A依賴A, N_A依賴A, 而項目工程Test依賴A,M_A,N_A這三個庫。
用workspace管理項目和依賴的庫
Test,A庫,M_A庫,N_A庫分別爲4個Project,並被一個workspace進行管理,看截圖:
按照常規,我們會在M_A, N_A靜態庫項目的Build Phases->Link Binary With Libraries中添加A.framework。在Test項目的相同位置添加A.framework,M_A.framework, N_A.framework。
編譯一下沒有問題。
出現Duplicate symbols問題
但是如果A中有某個.m文件僅僅只有類的category。那麼默認情況下,是不會被加載的。這個時候我們需要在Build Settings中的Other link flags中添加-ObjC參數。這個時候問題出現了,編譯test時會出現duplicate symbols的錯誤。
這是因爲XCode發現存在多份A的object文件,XCode認爲這樣會出現問題,於是報錯。
那麼如果解決duplicate symbols這個問題呢? 其實很簡單,我們在XCode編譯M_A.framework以及N_A.framework時不要link A.framework就好了。我們在M_A與N_A的target配置中Build Phases->Link Binary With Libraries刪除A.framework。
如下圖:
Test這個Target是必須要把依賴庫加進來的,因爲編譯成.app必須要link
解決工程編譯順序的問題
好了。現在編譯一下test工程,發現還是錯誤,說找不到<A/A.h>。但是再編譯兩次,第三次就發現編譯過了。
原因是在頭兩次編譯中,將A.framework,M_A.framework,N_A.framework編譯到build路徑下。第三次因爲test的庫都已經有了,於是就編譯通過。這其實涉及到一個編譯順序的問題。XCode先編譯test工程了,它發現找不到需要的頭文件(這個時候它依賴的庫還沒有生成好)。
XCode總是未卜先知,它可以幫我們解決這個問題。我們在Product->Schemes->Edit Schemes。在左側表單中選擇第一個Build。將Parallelize Build與Find Implicit Dependencies前面的勾去掉。
再將目標文件A.framework,N_A.framework,M_A.framework按依賴順序插到Test前面,越底層的更靠前,並將後面所有的check box都勾上。如下圖:
OK確認後,再進行編譯,發現是不是沒有問題了。
Clean Workspace
另外在workspace下,如果想把所有project都clean下,需要點擊菜單上的Product後,按住option鍵,發現Clean命令變成了Clean Build Folder了。點擊Clean Build Folder就把workspace下的Build文件夾全部刪除掉。
團隊協作
公司往往有一個團隊來協作完成一個App,那麼怎麼把剛纔的設置能共別人使用呢?就是別人從代碼倉庫獲取代碼後,就有同樣的scheme設置。那麼我們就要設置下scheme的共享。
在Product->Schemes->Edit Schemes->Manage Schemes...彈出的面板中,將test工程最後面那個checkbox給勾上,lib的勾不勾無所謂。
最後要把這個shemes文件加到倉庫中提交, 之前大部分人可能都把它忽略掉得,包括我,因爲覺得沒用。