【问题标题】:CMake configure_file with out of source buildCMake configure_file 没有源代码构建
【发布时间】:2018-03-02 20:12:31
【问题描述】:

我正在尝试使用 CMake 创建一些将由我的源代码读取的头文件。我的问题是,当我在我的build/ 文件夹中运行cmake .. 时,它会在我的构建文件夹中生成配置文件,然后当我运行生成的 Makefile 时,它​​找不到标题。

当然,我可以通过使用我的 C++ 文件中的 #include "build/config.h" 而不是 #include "config.h" 来解决这个问题,但我的 C++ 代码似乎不应该知道我的构建文件夹(我可能想要多个可能的构建设置,例如)。同样,我可以要求 CMake 将头文件写入源目录,但这会破坏源外构建设置。

有没有办法让 CMake 生成一个 Makefile 来构建,受这些约束?

我的 CMakeLists.txt 在下面。它读入config.h.in 并输出config.h

cmake_minimum_required(VERSION 3.9)
project(fftb)

set(CMAKE_CXX_STANDARD 17)

set(fftb_VERSION_MAJOR 0)
set(fftb_VERSION_MINOR 0)

configure_file(
    "${PROJECT_SOURCE_DIR}/config.h.in"
    "${PROJECT_BINARY_DIR}/config.h"
)

add_executable(fftb main.cpp config.h.in)

我的config.h.in在下面,它#defines要在main.cpp中使用的版本

#ifndef FFTB_CONFIG_H_IN_H
#define FFTB_CONFIG_H_IN_H

#define fftb_VERSION_MAJOR @fftb_VERSION_MAJOR@
#define fftb_VERSION_MINOR @fftb_VERSION_MINOR@

#endif //FFTB_CONFIG_H_IN_H

下面是我的main.cpp,它包含了自动生成的config.h并输出。

#include <iostream>
#include "config.h"

int main() {
    std::cout << "Version " << fftb_VERSION_MAJOR << "." << fftb_VERSION_MINOR << std::endl;
    return 0;
}

【问题讨论】:

  • 如果你写add_executable(fftb main.cpp "${PROJECT_BINARY_DIR}/config.h")怎么办?
  • 为什么不使用 include_directories 添加包含 .h 文件的目录(在本例中为 PROJECT_BINARY_DIR)?

标签: c++ cmake


【解决方案1】:

您可以通过将 include_directories(${PROJECT_BINARY_DIR}) 之类的内容添加到 CMakeLists.txt 中,将构建目录添加到目录列表以搜索包含文件

【讨论】:

  • 不要使用include_directories。在 Modern CMake 中,您想改用 target_* 函数
  • 这(或使用 cmake target_include_directories)是正确的解决方案。
猜你喜欢
  • 2013-08-18
  • 2021-01-31
  • 2021-03-17
  • 1970-01-01
  • 1970-01-01
  • 2018-06-07
  • 2015-11-07
  • 2016-08-14
  • 2020-12-09
相关资源
最近更新 更多