1. 程式人生 > >用workspace管理工程,並解決多靜態庫依賴

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

最近我在專案中遇到一些工程之間的管理問題。

模型:

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