c++ - 使用源代码构建的 CMake configure_file

标签 c++ cmake

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

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

有没有办法让 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;
}

最佳答案

您可以将构建目录添加到目录列表中以搜索包含文件,方法是将 include_directories(${PROJECT_BINARY_DIR}) 添加到 CMakeLists.txt

关于c++ - 使用源代码构建的 CMake configure_file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49076630/

相关文章:

c++ - 与Boost Filesystem的静态链接不起作用

CMake - 如何为目标可执行文件设置多个编译定义?

c++ - 在 CMake 中包含 Visual Studio 解决方案

c++ - 我可以在带有 Cmake 2.8.12.2 的 ubuntu 14.04 上为 C++ 使用 biicode 吗?

java - Android NDK 库仅在运行时不加载三星 galaxy 4.0.2 手机

c++ - boost Asio : Strange when use streambuf and async_write in mutl-thread

c++ - 使用 GetCursorPosition 有困难

C++ 流位掩码为 boolean 值?

c++ - STL列表中结构的自动初始化

boost - CMake:如何从目标链接列表中删除重复项?