【问题标题】:CMake: how to create include path to generated include filesCMake:如何创建生成的包含文件的包含路径
【发布时间】:2015-01-27 17:17:18
【问题描述】:

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

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

或者,在 CMake 尝试编译这些程序之前,如何强制将生成的文件安装到已知位置? (这个思路是基于当前的Makefile系统,生成header,安装到所有源文件都能找到的/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)

【问题讨论】:

  • 你知道你的编译器可以传递参数来告诉它额外的包含目录吗? cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html
  • 创建表头的时候,为什么不直接改变输出路径呢?你是如何创建它的?
  • @steveire 是的。我在问如何告诉编译器在生成文件的源外构建目录中查找依赖它的每个子目录(只有一些需要它)。
  • @Andreas-Haferburg 我想我可以做到,但 CMake 的使用是否正确?

标签: cmake


【解决方案1】:

之后

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

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

【讨论】:

    【解决方案2】:

    将生成的文件输出到源外构建目录是一种预期的方式。

    使用CMAKE_BINARY_DIRCMAKE_CURRENT_BINARY_DIR 作为输出前缀和include_directories() 参数。

    【讨论】:

    • set(GENERATED_HEADER_DIR ${CMAKE_CURRENT_BINARY_DIR}),然后是set_target_properties(&lt;target&gt; PROPERTIES INCLUDE_DIRECTORIES ${GENERATED_HEADER_DIR)
    • @arrowdodger 要么我误解了某些东西,要么这对CMAKE_CURRENT_BINARY_DIR 不起作用,因为该值未定义,除非 Cmake 在该特定目录中构建。我在原始问题中添加了一个很有希望的有用示例说明。
    猜你喜欢
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多