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

标签 cmake

我有一个包含大约 600 个目录的项目,其中包含大约十几个库和几十个程序的源代码。某些程序依赖于从文本文件生成的 C++ 头文件。

我如何清楚地告诉 CMake 如何将生成的头文件的路径包含到那些需要它的源文件的包含路径中?

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

或者还有其他选择吗?

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

这个例子不起作用。我需要一种方法来告诉 prog1 和 prog2 在哪里可以找到 home.h。

我的树:

.
|-- 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_minimum_required(VERSION 2.8.4)
project(prog1)
add_executable(prog1 prog1.cpp)
target_link_libraries(prog1 dict)
install(TARGETS prog1 DESTINATION bin)

最佳答案


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>
)

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

关于CMake:如何创建包含路径以生成包含文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27198947/

相关文章:

c++ - Linux:使用 inotify 与 fcntl 发生冲突

c++ - 如何在 QT Creator 中手动运行 CMake 和运行

python - OpenCV Python 链接器错误

android - CMAKE_BUILD_TYPE 版本 : strange results

c++ - 在 Eclipse 中使用 PCL

c++ - cmake 运行 xxd 作为自定义命令

c++ - 将 cmake 构建选项导出到外部项目

c++ - 使用 CMake 检测支持的 C++ 标准

c++ - 删除 `CMakeCache.txt` 会导致不再构建 `OPTIONAL` 安装目标

c++ - 使特定于 Unix 的 CMake 过程跨平台