用workspace管理工程,並解決多靜態庫依賴

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文件加到倉庫中提交, 之前大部分人可能都把它忽略掉得,包括我,因爲覺得沒用。

 

分類: iOS

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章