2012-06-28 29 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