2012-03-27 104 views
2

我在源碼樹中有一個名爲「time.h」的文件,正如系統「time.h」一樣。這不能改變。我遇到了cmake的一個問題,那就是當我使用include_library選項時,它被轉換爲-I標誌,這意味着我的自定義「time.h」會優先於系統時間h,即使對於<> include也是如此。這是一個定義不。cmake include_directories命令AFTER /之前

我試過使用include_directories(AFTER dir1 dir2),但它仍然生成-I選項而不是預期的-idirafter。

回答

3

我不認爲這是CMake的問題;無論在#include中是否使用引號或括號,也不管include_directories中的各種選項如何,我相信gcc總是會在系統之前找到您的「time.h」。見的的CMake的include_directories僅涉及如在海灣合作委員會的命令列出的目錄順序gcc documentation

AFTER選項-I-isystem的條目,它不涉及到GCC的-idirafter標誌。

這並不是一個很好的計劃,讓你自己的文件具有與系統文件相同的名稱,但是如果你的手綁定了,你可以避免這個問題,而不需要重新命名time.h,因爲它可以更全面地限定你自己包含的路徑。而不是例如

CMakeLists.txt: include_directories(${PROJECT_SOURCE_DIR}/src) 

header file:  #include <time.h> // we want but don't get system one 
       #include "time.h" // we want and get own custom one 

更多的東西一樣

CMakeLists.txt: include_directories(${PROJECT_SOURCE_DIR}) 

header file:  #include <time.h>  // we want and get system one 
       #include "src/time.h" // we want and get own custom one 


另一種選擇是與您當前#include設置堅持(使用該系統time.h中尖括號和報價爲自己的),而不是使用在CMakeLists.txt中完全可以使用include_directories。相反,我認爲你可以喜歡的東西替代它:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -iquote ${PROJECT_SOURCE_DIR}/src") 

使用-iquote可能比-idirafter視爲一個系統目錄是更好的選擇,因爲通過-idirafter指定的目錄(不正確地在這種情況下),因此具有警告被壓制等。

如果你確實去了這個選擇,可能值得評論CMakeLists.txt來解釋爲什麼沒有include_directories以避免將來的重構恢復爲使用更常規的include_directories命令。

總而言之,如果可能的話,最好的選擇是重命名你的「time.h」文件。

+0

非常感謝您的完整答案。第一種選擇對我來說不好,因爲問題不在於我的文件,而在於像「sched.h」這樣的系統文件,它錯誤地包含了我的文件而不是系統文件。所以可能,我將使用顯式編譯器選項而不是使用include_directories。 – Boris 2012-03-28 05:50:01

+0

我來到這個問題,因爲我在我的包含搜索路徑中無意中創建了一個名爲「new」的空本地文件。這搶佔了系統頭文件,它被我使用的庫使用了幾個#include級別。我花了好幾個小時弄清楚爲什麼(消息是**錯誤:'nothrow'不是'std'**之後編譯器崩潰的成員。 似乎我可以使用-iquote機制(是否有Visual Studio等效?)以確保通過尖括號包含的文件僅來自系統標題;如果通過CMake命令支持它將會很好。 – 2013-09-29 03:50:49

+1

有沒有人知道是否有像Visual Studio中的iquote(cl.exe標誌?) – 2013-10-25 21:48:23