【CMake】configure_file指令

本文详细介绍了如何在CMakeLists.txt中使用configure_file指令动态设置和生成项目信息,包括版本号、编译选项等,以方便项目维护。通过实例演示和相关链接,展示了如何通过修改CMake配置来改变编译后的产物。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0x00 前言

文章中的文字可能存在语法错误以及标点错误,请谅解;

如果在文章中发现代码错误或其它问题请告知,感谢!

cmake version: 3.10.2

系统版本:Ubuntu 18.04.4 LTS \n \l

最后更新:2021-11-15

0x01 configure_file指令说明

在一些情况下,我们需要在我们的项目中标注项目版本号增加编译选项等信息,我们可以在项目程序中直接通过手动编写我们的项目信息然后编译打印,也可以通过CMakeLists.txt文件的configure_file指令,将这些信息设置为变量,再写入.h.in文件并通过cmake编译生成.h文件,再将该.h文件包含进项目代码中,编译到可执行文件或库文件,从而实现项目信息打印等,这样的好处是可以只通过改CMakeLists.txt文件就能变更项目信息。

例如在CMakeLists.txt文件中定义了项目版本变量:

set(Version 1.0)
configure_file(src/build.h.in ${CMAKE_BINARY_DIR}/generated/build.h)

build.h.in文件中:

#define Project_Version @Version@

通过cmake编译后生成build.h文件,变量名称替换成了变量值:

#define Project_Version 1

configure_file
configure_file功能如下:
<input>文件里的内容全部复制到<output>文件中,并根据输入规则,复制时将<input> 文件中变量,替换成@VAR@${VAR}的变量值,若变量未被定义则替换为空字符串。

configure_file(<input> <output>
               [COPYONLY] [ESCAPE_QUOTES] [@ONLY]
               [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])

< input>:输入文件,默认路径是在 CMAKE_CURRENT_SOURCE_DIR路径下的寻找该文件;输入文件必须是文件而不是文件夹。通常情况下输入文件以.h.in为后缀。

< output >:输出的文件;默认路径为输出到CMAKE_CURRENT_BINARY_DIR路径下,若输出路径中文件已存在则替换。通常情况下输出文件以.h为后缀。

COPYONLY:只复制文件并不进行任何变量替换,在这个选项若指定了NEWLINE_STYLE选项时则无效。

ESCAPE_QUOTES:躲过任何的反斜杠风格的转义(C风格)。

@ONLY:堆变量替换进行限制,只对@VAR@引用变量进行替换而不对${VAR}进行替换。这在配置${VAR}语法的脚本时是非常有用的。

NEWLINE_STYLE <style>:指定输出文件中的新行格式。UNIX和LF的新行是\n,DOS和WIN32和CRLF的新行格式是\r\n。这个选项在指定了COPYONLY选项时无效。

0x02 程序实例

程序实例源代码github地址:
https://github.com/fyw4/优快云-Blog-Code/tree/master/CMake/configure_file
文件目录结构如下:
在这里插入图片描述

CMakeLists.txt文件内容:

cmake_minimum_required(VERSION 3.5)

project(TEST)

message(STATUS "PROJECT_SOURCE_DIR " ${PROJECT_SOURCE_DIR})
message(STATUS "PROJECT_BINARY_DIR " ${PROJECT_BINARY_DIR})

set(VERSION_MAJOR 1)
set(VERSION_MINOR 0)
set(PROJECT_NAME TEST)

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

aux_source_directory(. DIR_SRCS)

add_executable(${PROJECT_NAME} ${DIR_SRCS})

build.h.in文件内容:

#ifndef _BUILD_H_IN
#define _BUILD_H_IN

#define VERSION_MAJOR @VERSION_MAJOR@
#define VERSION_MINOR @VERSION_MINOR@
#define PROJECT_NAME "${PROJECT_NAME}"
#endif

主程序main.cpp:

#include "build.h"
#include <iostream>
using namespace std;
int main(int argc, char const *argv[])
{
	cout << "version is " << VERSION_MAJOR << ", " << VERSION_MINOR << endl;

	cout << "project name is " << PROJECT_NAME << endl;
	
	return 0;
}

make.sh为:

#!/bin/sh

# 删除一些产生的文件
rm -rf CMakeFiles
rm Makefile
rm build.h
rm TEST
rm CMakeCache.txt
rm cmake_install.cmake

cmake ./
make

./TEST

运行结果:
在这里插入图片描述

以上。

参考文档:
1.https://cmake.org/cmake/help/v3.14/command/configure_file.html?highlight=cmakedefine
2.https://blog.youkuaiyun.com/qq_38410730/article/details/103741579
3.https://www.cnblogs.com/gaox97329498/p/10952732.html

<think>嗯,用户遇到了CMake的错误,说“CMAKE_EXPORT_BUILD_SETTINGS”是未知的命令。我需要先弄清楚这个错误的原因。首先,我记得CMake有很多内置的命令和变量,但可能这个CMAKE_EXPORT_BUILD_SETTINGS已经被弃用了或者用户拼写错误了。 让我查一下CMake的文档。根据CMake的版本历史,CMAKE_EXPORT_BUILD_SETTINGS可能在旧版本中存在,但后来被移除了。比如,可能在CMake 2.8之后就不再支持了。用户可能在使用一个较新的CMake版本,导致这个命令无法识别。 然后,用户提供的引用中有提到使用工具链文件的例子,比如引用[1]里的Toolchain-eldk-ppc74xx.cmake,这说明用户可能在处理交叉编译或者项目配置。这时候,如果用户尝试使用旧的CMake命令,可能会遇到兼容性问题。 接下来,我需要考虑解决方案。首先,建议用户检查CMake的版本,确认是否过时或者太新。如果这个命令已经被弃用,可能需要替换为现代的方法,比如使用CMakePresets.json或者显式导出配置。 另外,用户可能需要更新他们的CMake脚本,避免使用已移除的命令。例如,改用set()或者include()来管理构建设置,或者利用CMake的导出和导入功能来处理项目间的依赖。 可能还需要检查用户的CMakeLists.txt文件,看看是否有拼写错误或者其他不兼容的指令。同时,确保所有相关的模块和工具链文件正确配置,如引用[1]中提到的工具链文件路径是否正确。 最后,建议用户参考最新的CMake文档和社区资源,确保他们的配置方法符合当前最佳实践。这样可以帮助他们避免类似的错误,并提高构建脚本的可维护性。</think>针对CMake报错"unknown command CMAKE_EXPORT_BUILD_SETTINGS"的问题,以下是分步解决方案: 1. **版本兼容性检查** - 该命令在CMake 2.8.12版本后被标记为过时,建议使用CMake 3.0以上版本 - 验证当前CMake版本: ```bash cmake --version ``` - 若版本低于3.0,建议升级至最新稳定版 2. **现代替代方案** - 使用`configure_package_config_file`代替: ```cmake include(CMakePackageConfigHelpers) configure_package_config_file( ${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/ProjectConfig.cmake INSTALL_DESTINATION lib/cmake/Project ) ``` - 或使用`export(EXPORT ...)`命令: ```cmake export(EXPORT MyProjectTargets FILE "${CMAKE_CURRENT_BINARY_DIR}/MyProjectTargets.cmake" ) ``` 3. **项目配置优化** - 在工具链文件中使用现代变量声明方式(参考引用[1]的配置方法): ```cmake set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_C_COMPILER powerpc-linux-gcc) set(CMAKE_CXX_COMPILER powerpc-linux-g++) ``` 4. **错误修复验证** - 添加内存泄漏检查(参考引用[2]的内存管理方法): ```cmake if(CMAKE_BUILD_TYPE STREQUAL "Debug") add_compile_options(-fsanitize=address) link_libraries(-lasan) endif() ``` 5. **构建系统可视化(参考引用[3]的发布方法)** ```cmake add_custom_target(export_settings ALL COMMAND ${CMAKE_COMMAND} -E echo "Build settings exported to build/" VERBATIM ) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值