我不認爲這是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」文件。
非常感謝您的完整答案。第一種選擇對我來說不好,因爲問題不在於我的文件,而在於像「sched.h」這樣的系統文件,它錯誤地包含了我的文件而不是系統文件。所以可能,我將使用顯式編譯器選項而不是使用include_directories。 – Boris 2012-03-28 05:50:01
我來到這個問題,因爲我在我的包含搜索路徑中無意中創建了一個名爲「new」的空本地文件。這搶佔了系統頭文件,它被我使用的庫使用了幾個#include級別。我花了好幾個小時弄清楚爲什麼(消息是**錯誤:'nothrow'不是'std'**之後編譯器崩潰的成員。 似乎我可以使用-iquote機制(是否有Visual Studio等效?)以確保通過尖括號包含的文件僅來自系統標題;如果通過CMake命令支持它將會很好。 –
2013-09-29 03:50:49
有沒有人知道是否有像Visual Studio中的iquote(cl.exe標誌?) – 2013-10-25 21:48:23