1

项目大致有以下结构:

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-impl.c在 `foo.c' 包含的 build 目录中生成,如下所示:

#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_directories("${CMAKE_CURRENT_BINARY_DIR}/src")

从根目录开始CMakeLists.txt(事实上,我现在就是这样做的),但这是不可接受的:每个子目录都会看到父目录的文件,这最终会导致文件名冲突。

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

4

1 回答 1

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")(必须在定义目标后完成)。

于 2013-01-17T09:06:58.433 回答