2012-06-28 41 views
0

我被分配到完全運行使用CMake的一個項目,避免多次include_directories指令。使用cmake

基本上,該項目具有超過20個模塊,並且每個模塊我創建一個文件的CMake 如:

# Module: CFS 
file(
    GLOB_RECURSE 
    files 
    *.c 
    *.cpp 
) 

include_directories("${PROJECT_SOURCE_DIR}/include/PEM/cfs") 
include_directories("${PROJECT_SOURCE_DIR}/include/PEM/kernel2") 
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) 
add_library(cfs ${files}) 

kernel2是另一模塊,並且具有其自己的CMakeFile。

現在的問題是,第三模塊:M3需要從CFS頭(這也需要從kernel2頭)

所以我基本上去:

# Module: m3 
file(...) 
include_directories("${PROJECT_SOURCE_DIR}/include/PEM/cfs") 
add_library(m3 ${files}) 
target_link_library(m3 cfs) 

很不幸,這是遠遠不夠的,kernel2包括文件將不會被發現時,我編譯除非我加:

include_directories("${PROJECT_SOURCE_DIR}/include/PEM/kernel2") 

我做錯了嗎?也許我還應該使用add_library指令添加包含文件?

回答

1

如果您有CFS的頭#include指令,那麼你應該使用

include_directories("${PROJECT_SOURCE_DIR}/include/PEM/kernel2") 

這不是CMake的問題,而是如何C/C++編譯器工程。

例如,你在CFS以下標題:

#include "kernel2/someclass.h" 

class SomeCfsClass 
{ 
private: 
    SomeKernelClass kernelObject; 
} 

現在,如果你希望你的立方米模塊實例SomeCfsClass,編譯器應該知道它的大小。但知道它的大小也不是沒有可能從kernel2/someclass.h knowning SomeKernelClass定義。

這種情況可以通過內部SomeCfsClass不是對象,但指針存儲到服務器來解決:

class SomeKernelClass; // forward declare SomeKernelClass 

class SomeCfsClass 
{ 
private: 
    SomeKernelClass * kernelObject; 
} 

不過,當然,有這樣的情況,當它根本就不可能避免包括。

作爲替代方案,我可以建議在#include指令來使用相對路徑,但是這種解決方案是有點的hackish。

+0

任我解釋是錯誤的或聽錯了。但由於CFS編譯並輸出一個庫文件,是不是有什麼辦法可以告訴M3使用該庫不包括kernel2頭? – Salepate

+0

如果cfs的頭文件包含kernel2頭文件 - 沒有。如果你願意,我可以解釋爲什麼是這樣。 – arrowd

+0

如果你不介意,我希望那樣。 – Salepate