【问题标题】:How to ensure a generated config.h file is in the include path?如何确保生成的 config.h 文件在包含路径中?
【发布时间】:2018-02-02 10:13:18
【问题描述】:

我使用 CMake 构建一个 C 项目。具体来说,我使用以下行:

configure_file(config.h.in config.h @ONLY)

只要我在源目录中构建,它就可以正常工作。但是,如果我在其他地方构建,config.h 文件将在 /path/to/build/dir/config.h 中创建,而不是在源目录中创建 - 这不是包含路径的一部分。我怎样才能拥有 CMake...

  • 确保包含此特定文件,或
  • C 编译器是否同时在原始源目录和构建目录下查找包含文件?

【问题讨论】:

    标签: c cmake config include-path


    【解决方案1】:

    在 CMake 中包含带有 CMAKE_INCLUDE_CURRENT_DIR 的目录是自动的:

    set(CMAKE_INCLUDE_CURRENT_DIR ON)
    

    如果启用此变量,CMake 会自动将CMAKE_CURRENT_SOURCE_DIRCMAKE_CURRENT_BINARY_DIR 添加到每个目录的包含路径中。

    因此,我更愿意在我的CMakeLists.txt 中根据需要单独拨打以下电话:

    include_directories("${CMAKE_CURRENT_BINARY_DIR}")
    

    编辑:感谢@zaufi 的提示,如果您生成的头文件具有目标范围,那么您应该更喜欢(CMake >= 版本 2.8.12)使其仅对该目标可见(并非针对所有目标全局):

    target_include_directories(MyLibrary PRIVATE "${CMAKE_CURRENT_BINARY_DIR}")
    

    注意:对于具有相对路径的源文件,CMake 在 CMAKE_CURRENT_SOURCE_DIRCMAKE_CURRENT_BINARY_DIR 两个目录中查找。

    【讨论】:

    • 我使用了你的第二个建议,因为我实际上需要将"${CMAKE_CURRENT_BINARY_DIR}/src" 放在包含路径中。
    • 使用target_include_directories(<target> PRIVATE ...) 而不是include_directories
    • @zaufi 感谢您的提示。是的,如果您不生成全局配置标头,您应该更喜欢 target_include_directories() 调用。我已经相应地更新了我的答案。
    猜你喜欢
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    相关资源
    最近更新 更多