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++ - 如何实现 std::set 或 std::hash_set 来过滤数组列表中的重复项?

android - 使用 CMake 在 C++ android 应用程序中使用 libcurl

c++ - cmake target_link_libraries()启动错误无法为目标指定链接库 "debug"

c++11 - 无法使用适用于Android的CMake GUI启用C++ 11的情况下编译ChaiScript

c++ - x86_64 的 Cmake 错误 undefined symbol

cmake - 如何使用 Qt Creator 加载多个项目的 cmake 脚本

c++ - 修改PIN中的申请说明

c# - Visual Studio 技巧来回转到某些行

c++ - Windows C++ 将启动的子进程带到前台

c++ - 在静态库中存储线程 ID 的正确方法