包括CMAKE_CURRENT_BINARY_DIR不适用于子目录

时间:2013-01-17 08:30:11

标签: cmake

该项目大致具有以下结构:

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>

人们如何在大型项目中克服这个问题?或者我做错了什么?

1 个答案:

答案 0 :(得分:2)

与大多数cmake命令一样,include_directories仅影响该目录和子目录中的目标。并且IIRC仅在命令之后定义目标。那是故意的。这是为不同模块定义不同标志的方式。

当我像大多数cmake命令一样说时,我的意思最多。最重要的是包括add_definitionsset,但CACHE参数除外。

还要记住,include_directories苹果到目标,而不是文件。

在子目录中定义库(对我来说最有意义),将所有内容放在顶级CMakeLists.txt中或仅使用set_target_properties(lib_name PROPERTIES COMPILE_FLAGS "-I${CMAKE_BINARY_DIR}/src")在目标上设置标志(必须在定义了目标。)