使用Cmake避免使用多个include_directories指令

时间:2012-06-28 08:51:34

标签: cmake

我被指派使用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 个答案:

答案 0 :(得分:1)

如果你在cfs的标题中有#include个指令,那么你应该使用

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

这不是CMake的问题,而是C / C ++编译器的工作原理。

例如,您在cfs中有以下标题:

#include "kernel2/someclass.h"

class SomeCfsClass
{
private:
    SomeKernelClass kernelObject;
}

现在,如果您希望在 m3 模块中实例化SomeCfsClass,编译器应该知道它的大小。但是如果不知道kernel2 / someclass.h中的SomeKernelClass定义,就不可能知道它的大小。

这种情况可以通过不存储对象来解决,而是指向SomeCfsClass内的指针:

class SomeKernelClass; // forward declare SomeKernelClass

class SomeCfsClass
{
private:
    SomeKernelClass * kernelObject;
}

但当然,有些情况下,根本不可能避免包括。

作为替代方案,我可以建议在#include指令中使用相对路径,但这个解决方案有点hackish。