CMake:如何创建包含路径以生成包含文件

CMake:如何创建包含路径以生成包含文件,cmake,Cmake,我有一个有大约600个目录的项目,其中包含大约12个库和几十个程序的源代码。有些程序依赖于从文本文件生成的C++头文件。 如何清楚地告诉CMake如何将生成的头文件的路径包含到需要它的源文件的包含路径中 或者,在CMake尝试编译这些程序之前,如何强制将生成的文件安装到已知位置?(这个想法基于当前的Makefile系统,该系统生成头文件并将其安装到/include目录中,所有源文件都可以在该目录中找到它。) 还是有其他选择 --编辑:添加了“玩具”示例-- 这个例子不起作用。我需要一种方法告诉p

我有一个有大约600个目录的项目,其中包含大约12个库和几十个程序的源代码。有些程序依赖于从文本文件生成的C++头文件。 如何清楚地告诉CMake如何将生成的头文件的路径包含到需要它的源文件的包含路径中

或者,在CMake尝试编译这些程序之前,如何强制将生成的文件安装到已知位置?(这个想法基于当前的Makefile系统,该系统生成头文件并将其安装到/include目录中,所有源文件都可以在该目录中找到它。)

还是有其他选择

--编辑:添加了“玩具”示例--

这个例子不起作用。我需要一种方法告诉prog1和prog2在哪里找到家

我的树:

.
|-- prog1/
|   |-- CMakeLists.txt
|   `-- prog1.cpp
|-- prog2/
|   |-- CMakeLists.txt
|   `-- prog2.cpp
`-- share/
    `-- dict/
        |-- CMakeLists.txt
        `-- gen.sh*
在分享/口述中:

cmake_minimum_required(VERSION 2.8.4)
project(dict)

set(SRC foo.c)
set(HEADERS foo.h home.h)

add_custom_target(home
  ALL
  DEPENDS ${CMAKE_INSTALL_PREFIX}/include/home.h
)

add_custom_command(
  OUTPUT ${CMAKE_INSTALL_PREFIX}/include/home.h
  COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/gen.sh gen.sh
  COMMAND gen.sh ${CMAKE_INSTALL_PREFIX}
)

add_library(dict ${SRC})

install(TARGETS dict DESTINATION lib)
install(FILES ${HEADERS} DESTINATION include)
在prog1中(与prog2类似):


将生成的文件输出到源代码外的构建目录是一种理想的方法

使用
CMAKE\u BINARY\u DIR
CMAKE\u CURRENT\u BINARY\u DIR
作为输出前缀和
include\u directories()
参数。

之后

add_library(dict ${SRC})

target\u包括目录(dict
#安装前标题的位置
$
#安装后标头的位置
$
)

阅读我在评论中已经提供的链接

您知道可以向编译器传递参数来告诉它其他包含目录吗?创建标头时,为什么不更改输出路径呢?你是如何创造它的?@steveire是的。我问的是如何告诉编译器在生成文件的源代码外构建目录中查找依赖于它的每个子目录(只有一些人需要它)。@Andreas Haferburg我想我可以这样做,但这是正确的CMake用法吗?还是
set(生成的\u头\u目录${CMake\u当前的\u二进制\u目录})
然后稍后
设置\u目标\u属性(属性包括\u目录${生成的\u头\u目录)
@arrowdoger要么我误解了什么,要么这对
CMAKE\u CURRENT\u BINARY\u DIR不起作用,因为除了在该特定目录中构建CMAKE外,该值未定义。我在原始问题中添加了一个很有希望有用的示例来说明这种情况。
add_library(dict ${SRC})
target_include_directories(dict 
    # The location of the headers before installation 
    $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
    # The location of the headers after installation
    $<INSTALL_INTERFACE:include>
)