该项目大致具有以下结构:
include/
lib_name/
public_foo.h
public_bar.h
src/
CMakeLists.txt
foo.c
foo.h
bar.c
bar.h
CMakeLists.txt
顶级CMakeLists.txt
文件定义了共享库目标
add_library(lib_name SHARED "src/foo.c" "src/bar.c")
同时,还有一个自定义命令
add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/src/foo-impl.c" ...)
在`foo.c'包含的构建目录中生成foo-impl.c
,如下所示:
#include <some_header.h>
#include <other.h>
#include "foo-impl.c"
为了能够加入foo-impl.c
,我在src/CMakeLists.txt
include_directories("${CMAKE_CURRENT_BINARY_DIR}")
看起来应该有用,对吧?
嗯,它不起作用 - src
目录未添加到foo.c
的编译器标志中。似乎include目录只影响在同一目录(或子目录)中定义的目标。
我知道我可以做到
include_directories("${CMAKE_CURRENT_BINARY_DIR}/src")
来自根CMakeLists.txt
的(事实上,这就是我现在正在做的事情),但这是不可接受的:每个子目录都会看到父文件,这最终会导致文件名冲突。 / p>
人们如何在大型项目中克服这个问题?或者我做错了什么?
答案 0 :(得分:2)
与大多数cmake命令一样,include_directories
仅影响该目录和子目录中的目标。并且IIRC仅在命令之后定义目标。那是故意的。这是为不同模块定义不同标志的方式。
当我像大多数cmake命令一样说时,我的意思最多。最重要的是包括add_definitions
和set
,但CACHE
参数除外。
还要记住,include_directories
苹果到目标,而不是文件。
在子目录中定义库(对我来说最有意义),将所有内容放在顶级CMakeLists.txt
中或仅使用set_target_properties(lib_name PROPERTIES COMPILE_FLAGS "-I${CMAKE_BINARY_DIR}/src")
在目标上设置标志(必须在定义了目标。)