我被指派使用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指令添加包含文件?
答案 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。