0

我被分配使用 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 指令添加包含文件?

4

1 回答 1

1

如果您#include在 cfs 的标头中有指令,那么您应该使用

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

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

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

#include "kernel2/someclass.h"

class SomeCfsClass
{
private:
    SomeKernelClass kernelObject;
}

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

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

class SomeKernelClass; // forward declare SomeKernelClass

class SomeCfsClass
{
private:
    SomeKernelClass * kernelObject;
}

但是,当然,在某些情况下,根本无法避免包括在内。

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

于 2012-06-28T09:42:40.843 回答