2011-03-02 86 views
12

將其他文件夾中的文件與其他包含目錄包含在同一文件夾中的最佳方法是什麼?庫包含具有相同標題名稱的路徑

實施例:

lib1/include/foo.h 
lib2/include/foo.h

其中兩個LIB1 /包括和LIB2 /包括在額外添加包括目錄。

編輯:

該庫是從不同的SDK的和每一個開發人員安裝他們自己的地方。這是唯一肯定的是,這兩個文件夾在IDE的附加包含路徑

方法1:

#include "../../lib1/include/foo.h

方法2:

添加LIB1/LIB2之前包括/包括在搜索路徑和原因他們按順序搜索與:

#include "foo.h"

李B1 /包括/ foo.h中將會包含

+1

方法2是不好的,因爲程序編譯依賴於設置(包括目錄順序)不在代碼本身。如果有人不得不重建項目設置,這個問題甚至不會出現,更不用說正確的設置。 – 2011-03-02 14:17:01

+0

@Mike我知道這些不是最好的方法,但是我現在想到的唯一方法。因爲我不喜歡這些方法,所以我在這裏問了一些更好的方法。 – Felics 2011-03-02 15:17:21

回答

4

首先,這個答案假設兩個標題的包括守衛是兼容的(即不是相同的符號)。

你可以做的一件事就是在已知位置創建鏈接到感興趣的頭文件,給鏈接本身賦予不同的名稱。例如,假設你的兩個庫安裝在$ LIB1PATH和$ LIB2PATH中,它們可以在不同的構建環境中具有不同的值。因此你想得到的頭文件位於$ LIB1PATH/include/foo.h和$ LIB2PATH/include/foo.h。

你可以用這兩種方法。一個是通過創建直接鏈接。這可能看起來像這樣在你的項目的目錄樹:

$PROJDIR/ 
    include/ 
    lib_include/ 
     lib1_foo.h -> $LIB1PATH/include/foo.h 
     lib2_foo.h -> $LIB2PATH/include/foo.h 
    src/ 

這可能變得棘手,如果你的代碼是在存儲庫中,因爲你不能檢查這些鏈接;他們在其他環境中會出錯。另外,如果你有很多這些鏈接和很少的庫,每當lib1或lib2移動時都不得不重新創建它們。您可以通過創建包含該項目的目錄的目錄鏈接解決這個問題:

$PROJDIR/ 
    include/ 
    lib_include/ 
     lib1_foo.h -> ../../lib1/include/foo.h 
     lib2_foo.h -> ../../lib2/include/foo.h 
    src/ 
lib1 -> $LIB1PATH/ 
lib2 -> $LIB2PATH/ 

在這兩種情況下,你需要確保$PROJDIR/lib_include是include路徑。另外,如果兩個foo.h標題從這些目錄中拉入更多標題,則只需要在包含路徑中包含$LIB1PATH/include$LIB2PATH/include。你也可以把鏈接放在include,擺脫lib_include,但我喜歡把這些東西分開。

5

你可以只是這樣做:

#include "lib1/include/foo.h" 
#include "lib2/include/foo.h" 

,並確保這兩個lib1lib2的父目錄都在搜索路徑包括(但不實際include子目錄本身)。

注意,如果兩個頭使用相同的符號作爲一個包括警衛那麼這種方法是行不通的 - 你需要取消定義衝突的符號兩者之間包括:

#include "lib1/include/foo.h" 
#undef FOO_H 
#include "lib2/include/foo.h" 
+0

這些庫來自不同的SDK,每個開發者都將它們安裝在他自己的位置。唯一可以肯定的是這兩個文件夾都在IDE的附加包含路徑中 – Felics 2011-03-02 13:48:44

+0

@Felics:這就是爲什麼你必須避免'#include「foo.h」'。你是否說過安裝SDK的目錄名稱(本例中是'lib1'和'lib2')不確定?如果是這樣,你唯一的解決方案是創建兩個頭文件不同名稱的鏈接,並使用這些鏈接到達頭。即使這可能不起作用,因爲包括衛兵問題eznme提到。 – 2011-03-02 14:14:03

+0

爲什麼匿名倒票?如果低調的選民有一個有效的批評,那麼請隨意播放它,我會很樂意修改我的答案或相應地刪除它。 – 2011-03-02 14:18:17

7
#include "lib1/include/foo.h" 
#include "lib2/include/foo.h" 

是罰款只要這是到那些標題的實際相對路徑並且包括警衛是不同的。例如,如果兩個foo.h中使用

#ifndef _foo_h_ 

那麼這會給你你不想要的東西(這將只包括一個,不能同時和哪一個取決於執行的順序)。

+0

+1:關於包括衛兵的好點! – 2011-03-02 14:16:08

+0

非常感謝你的先生,你:關於搜索路徑的好處! – 2011-03-02 17:15:31

1

我將包括一個明確的目錄是在-I列表(也就是說路徑,其中包含LIB1和LIB2目錄)中的文件:

#include "lib1/include/foo.h" 
#include "lib2/include/foo.h" 

因此不會有歧義,因爲預編譯器將在其目錄列表中查找lib1/include/foo.h,並且這不會發生在lib1/include/lib2/include/之間,而只發生在父目錄中。

如前所述:即使對於lib頭文件,保護警衛也應該包含lib名稱以避免這種混淆。

4

我想知道在目前的4個答案和1709個意見中,沒有人會提供這樣簡單直接的解決方案。

您可以隨意包含這些文件,唯一真正會遇到的問題是關於相同的警衛頭文件。所以,你必須創建一個包含衝突頭文件的頭文件。我們稱之爲inc_foo_lib1_lib2.h。在這個文件中你包含第一個foo.h,那麼如果guard頭被定義爲undefine,那麼包括第二個foo.h

舉個例子假設foo.h有一個頭文件保護FOO_H_INCLUDED,那麼你的inc_foo_lib1_lib2.h是看起來像:

#include "lib1/foo.h" 
#ifdef FOO_H_INCLUDED 
#undef FOO_H_INCLUDED 
#else 
COMPILATION ERROR — the header guard was changed! 
#endif //FOO_H_INCLUDED 
#include "lib2/foo.h" 
相關問題