2014-10-07 132 views
0

我想在Xcode(6.0.1)中使用兩個版本的靜態庫創建一個項目。因此,我創建了類似於這樣的目錄結構:Xcode:多個版本的靜態庫

+ include 
    |-- VersionA 
     |-- foo.h 
     |-- bar.h 
    |-- VersionB 
     |-- foo.h 
     |-- bar.h 

+ lib 
    |-- VersionA 
     |-- foo.a 
     |-- bar.a 
    |-- VersionB 
     |-- foo.a 
     |-- bar.a 

了foo.h和bar.h在兩個目錄是類似的標題,而可執行文件是不同的。爲了包括一定的頭,我(非遞歸)的添加包括目錄到搜索路徑中包含的是這樣的:

#include "VersionA/foo.h" // or this: 
#include "VersionB/bar.h" 

現在的問題是:如何Xcode中決定哪些Mach-O的脂肪(。 a)鏈接某個頭文件的文件?這項任務如何工作,我如何影響它?

編輯:

我沒有得到任何重複的符號鏈接錯誤,雖然看起來連接到這兩個lib目錄。由於頭文件有像下面這樣的警衛:

#ifndef FOO_H 
#define FOO_H 
... 

我在重定義方面也沒有錯誤。如果我改變一個包括後衛即

的#ifndef FOO_H_VERSION1

有在編譯時錯誤(思邁特問題,「FOO_SOMETHING」的重新定義)。這對我來說很有意義,並指出複製頭文件可能不是最佳做法。

儘管如此,對於我的項目我需要兩個版本的靜態庫。什麼是實現這一目標的合理方法?

回答

1

包含頭文件不會自動包含或鏈接庫 - 您可以在構建階段的「鏈接二進制文件庫」部分指明要鏈接哪些庫。

就你而言,你只需要添加所有的庫,然後在相關的地方使用相應的頭文件。

但是,您已經說過這些是同一個庫的不同版本。如果您的庫包含相同名稱的方法,則鏈接器會對此抱怨。考慮到這一點,你應該重新考慮是否有必要包含相同庫的單獨版本 - 如果一個/兩個庫的問題阻止你使用一個,它可能會更有用(並最終減輕壓力)來嘗試解決這個問題。

+0

有趣的是,鏈接器不會抱怨重複的符號,儘管它明顯地鏈接了兩個庫目錄。但是 - 因爲頭文件有相同的內容 - 應該有重複的,對吧? – Simon 2014-10-07 09:10:09

+0

好吧,你是對的,它很安靜,只能使用一個版本。謝謝! – Simon 2014-10-07 12:26:12

+0

@Simon很喜歡它的作品。關於你的第一條評論,在大多數情況下,鏈接器不會在你的鏈接庫中查找函數,除非你實際使用了它們。如果您使用兩個庫版本之間沒有重複的獨立函數,則應該沒有問題。如果不是 - 這很奇怪 - 只是希望它能繼續工作! – ttarik 2014-10-07 13:17:06

0

頭文件不與任何東西「鏈接」。這是發生了什麼。您可以通過頭文件爲大量不同的方法創建一個承諾,然後將該承諾提供給鏈接器。鏈接器的工作之一是搜索項目中包含的所有工件,以確保每種方法都實際存在。如果丟失了一個,你會得到一個丟失的符號錯誤。如果兩個庫定義了一個名稱相同的方法,則會出現重複的符號錯誤。最後那些.a文件不存在。一切都放在一個二進制文件中。