2010-04-07 110 views
14

我的Xcode項目使用兩個目標構建到同一產品的變體。兩者之間的區別僅在於使用了包含的庫的哪個版本。對於.c源文件,使用目標複選框很容易將正確的版本分配給正確的目標。但是,包含頭文件始終包含相同的文件。這對一個目標是正確的,但對另一個目標是錯誤的。控制Xcode將包含哪個項目頭文件

有沒有辦法控制每個目標包含哪個頭文件?

這裏是我的項目文件的層次結構(這是在Xcode複製):

MyProject 
    TheirOldLib 
    theirLib.h 
    theirLib.cpp 
    TheirNewLib 
    theirLib.h 
    theirLib.cpp 
myCode.cpp 

和myCode.cpp做的事情,如:

#include "theirLib.h" 
… 
somecode() 
{ 
#if OLDVERSION 
    theirOldLibCall(…); 
#else 
    theirNewLibCall(…); 
#endif 
} 

當然,我定義OLDVERSION一目標而不是另一個。

注意#include必須如圖所示。下面的兩個失敗與文件未找到錯誤的:

#include "TheirOldLib/theirLib.h" 
#include "TheirNewLib/theirLib.h" 

那麼,有沒有辦法告訴Xcode的每個目標包括theirLib.h

限制條件:
- 兩個頭文件具有相同的名稱。作爲最後的手段,我可​​以重新命名其中一個,但我寧願避免這種情況,因爲這會導致其他平臺上的主要頭髮被拉扯。
- 必須更改#include以添加對封閉文件夾的引用也是我寧願避免的,因爲我需要使用條件編譯指令來執行兩次。
- 我可以自由調整我的項目,因爲我認爲合適

感謝您的任何幫助。

回答

21

答案的關鍵部分是使用USE_HEADERMAP = NO,如Chris在評論中所建議的那樣。這裏是細節。

短配方(在Xcode 3.2.2選中):

  1. 添加USE_HEADERMAP的一個自定義生成設定= NO爲每個關注目標。這裏是如何:
    1.1。在「構建」窗格中打開目標的信息面板。
    1.2。拉下窗口左下角的動作彈出菜單,選擇「添加用戶定義的設置」。
    1.3。在新添加的行中,將第一列(「設置」)設置爲USE_HEADERMAP,將第二列(「值」)設置爲NO

  2. 爲每個目標添加正確的包含路徑(目標構建設置「標題搜索路徑」)。在我的例子中是:
    2.1。爲「舊」目標添加TheirOldLib
    2.2。添加TheirNewLib爲「新」的目標

步驟1禁用的Xcode的自動頭部地圖功能,通過它包含在項目中的任何頭文件是通過它的名字,不管它的實際路徑直接訪問。當兩個標題具有相同的名稱時,此功能會導致無法解決的歧義。

步驟2允許#include "theirLib.h"在沒有限定頭文件實際路徑名的情況下工作。

這兩個步驟一起滿足了我的兩個約束。據我所知,最後,USE_HEADERMAP而不是。我會填寫一份錯誤報告,因爲這個設置在很多情況下都非常重要,因爲它使用Google進行展示。報告爲rdar:// 7840694。同樣在開放式雷達上,因爲http://openradar.appspot.com/radar?id=253401

+0

這很好用。謝謝。海報應該標記爲答案。 – SmallChess 2010-12-04 13:25:58

+2

不應該在第2步。是「用戶標題搜索路徑」而不是「標題搜索路徑」?因爲你使用#include「」而不是#include <> – Olof 2012-04-13 11:30:03

+0

我想你是對的。 'Header Search Paths'起作用,但'User Header Search Paths'應該更好。 – 2012-04-13 15:43:03

0

爲什麼你不能在每個目標中使用不同的包含路徑?

+2

如果您有兩個具有相同名稱但路徑不同的標頭,則需要在兩個目標中的自定義生成設置中設置USE_HEADERMAP = NO。 – cdespinosa 2010-04-08 02:58:42

+0

整潔。我想我從來沒有嘗試過。很高興看到Mike Ferris仍在與可用性做鬥爭。 – 2010-04-08 03:16:59

+0

在每個目標中使用不同的包含路徑不起作用:包含文件*在*項目總是可以由Xcode訪問,根本沒有路徑。這就是爲什麼這個問題首先出現的原因:沒有消除歧義的道路,似乎沒有辦法告訴Xcode哪個是正確的文件。克里斯的建議是禁用該功能,以扭轉更傳統的包含路徑方案。我會詳細寫出答案。 – 2010-04-08 08:23:28

相關問題