首页 > 其他分享 >cmake之configure_file指令

cmake之configure_file指令

时间:2023-06-29 12:46:03浏览次数:54  
标签:projName cmake configure VERSION file output hello

[! note]
需要知道最基本的cmake使用方法和命令。project、cmake_minimum_required、add_executable、target_include_directories等指令

官网给的指令格式如下:
```cmake
configure_file(<input> <output>
               [NO_SOURCE_PERMISSIONS | USE_SOURCE_PERMISSIONS |
                FILE_PERMISSIONS <permissions>...]
               [COPYONLY] [ESCAPE_QUOTES] [@ONLY]
               [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])

它的作用,拷贝input文件的内容到output文件,是覆盖的写入。output文件可以不存在。在拷贝过程中,会把@VAR@${VAR}$CACHE{VAR}$ENV{VAR} 这些表达式替换为CMAKE中定义的变量对应的值。

再使用cmake命令的时候,会执行configure_file命令,生成output文件


这里先不讲那些可选项,就先使用最简单的configure_file(<input>, <output>)
一般需要使用这种方式生成的output文件都是头文件(要是是源文件就很傻逼,对吧)

假设,我们需要在源文件中输出现在项目的版本号,那么我们可以使用configure_file来实现。在cmake中,我们使用project(projName VERSION 1.0) 这种写法,会让cmake生成几个变量:PROJECT_NAMEprojName_VERSION_MAJORprojName_VERSION_MINOR
上面的projName 可以就是实实在在的项目名称"projName";也可以只是一个代指,若是是一个代指的话,projName_VERSION_MAJORprojName_VERSION_MINOR 中的projName也要随之改变。我们假设例子中的项目名称就叫做projName

好,说了这么多,要开始说如何在源代码中得到这三个cmake中的变量了。首先我们得先定义一下input、output两个文件的名称,并且output是一个头文件,假设我们把output定为hello.h,input文件名随意,不过一般使用hello.h.in作为对应。之后在hello.h.in文件和main.cpp文件中写入:

// hello.h.in
#define projName_MAJOR_VERSION @projName_VERSION_MAJOR@
#define projName_MINOR_VERSION @projName_VERSION_MINOR@
#define PROJ_NAME "@PROJECT_NAME@"
#define MAX_NUM 100
// main.cpp
#include <iostream>
#include "hello.h"

using namespace std;

int main() {
	cout << "Hello cmake!" << endl;
	cout << "project name: " << PROJ_NAME << endl;
	cout << "project major version: " << projName_MAJOR_VERSION << endl;
	cout << "project minor version: " << projName_MINOR_VERSION << endl;
	cout << "MAX NUM: " << MAX_NUM << endl;
	return 0;
}

在CMakeLists.txt文件中加入:

configure_file(hello.h.in hello.h)

得到:

cmake_minimum_required(VERSION 3.10)

project(Hello VERSION 1.0
	DESCRIPTION "Very Nice Project!"
	LANGUAGES CXX
	)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

add_executable(hello main.cpp)

configure_file(hello.h.in hello.h)
target_include_directories(hello PUBLIC
	"${PROJECT_BINARY_DIR}"
)

之后运行cmake相关命令:

mkdir build
cd build
cmake ..
make

得到的可执行文件就可以运行了

在Vscdoe这种编辑器当中,可能会对main.cpp#include语句进行标红,因为没有hello.h文件,但是执行完cmake语句后会生成(报错可能还在,跟output的路径有关),但是没关系,依旧可以使用make生成可执行文件

标签:projName,cmake,configure,VERSION,file,output,hello
From: https://www.cnblogs.com/Fortunater/p/17513919.html

相关文章

  • 关于CIFS-Common Internet File System-通用Internet文件系统
    服务器消息块(SMB)协议是一种网络文件共享协议,在MicrosoftWindows中实现的称为MicrosoftSMB协议。定义特定版本的协议的消息数据包集称为方言。通用Internet文件系统(CIFS)协议是SMB的方言。VMS、Unix的多个版本和其他操作系统上也提供SMB和CIFS。 CIFS是......
  • 使用exceljs和file-saver导出带图片的excel表格
    参考https://www.swvq.com/article/detail/487https://github.com/exceljs/exceljs/blob/master/README_zh.md#图片importExcelJSfrom'exceljs'importfileSaverfrom'file-saver'letworkbook=nullletworksheet=null//图片转base64constco......
  • 用CMake 替换 Makefile
    原文:https://blog.csdn.net/love131452098/article/details/116241448CMake实质上是用于生成Makefile的工具,现在越来越多开源的项目,在项目的编译框架上使用CMake替换Makefile.CMake相对于Makefile规则更加简单,重要的是CMake官方网站提供了较为友好的指南.CMake官方学习资......
  • Vscode自动生成注释的神器-KoroFileHeader
    1、安装KoroFileHeader设置-->扩展(ctrl+S)-->搜索KoroFileHeader,并安装 2、设置函数注释与文档注释设置—》搜索fileheaderconfiguration-》编辑setting.json文件设置自己的注释格式  //文件头注释"fileheader.customMade":{"Filename":"",......
  • python zipfile 打包压缩 层级过多的解决措施
    zipfile使用详细https://www.cnblogs.com/yyds/p/6427349.html解决方案https://blog.csdn.net/csrh131/article/details/107895772操作案例和总结https://blog.51cto.com/u_16055028/6475844https://mp.weixin.qq.com/s/2RDCnQLORmn8kMHJsOhenA......
  • windows和linux环境下安装jprofiler
    Windows安装jprofiler一.windows安装和激活1.首页默认,直点击下一步2.同意授权3.进入注册页面4.在注册页面输入用户和密钥5.打开注册机,点击generate生成账号和密钥6.把licensekey输入到步骤一中的密钥框,公司名字可以顺便写7.直接点击下一步,完成安装二.Linux安装1.......
  • springboot 通过SchedulingConfigurer实现多定时任务注册及动态修改执行周期
    Spring中定时任务有两种实现方式:1.@Scheduled(cron表达式)2.基于SchedulingConfigurer注册定时任务这两者的区别主要有1.@Scheduled不支持动态修改定时周期,只能停止服务器,修改cron表达式,再启动服务器;SchedulingConfigurer可以动态修改2.@Scheduled只能是单线程,而SchedulingConfi......
  • CMake快速入门
    CMake快速入门目录CMake快速入门1.为什么要使用CMake?2.创建第一个CMake工程3.CMake指令介绍3.1cmake_minimum_required指令3.2project指令3.3set指令3.4message指令3.5add_executable指令3.6add_subdirectory指令3.7add_library指令3.8add_compile_opti......
  • 系统断电后,MySQL重启失败:[ERROR] Binlog has bad magic number; It‘s not a binary lo
    系统断电后,MySQL重启失败:[ERROR]Binloghasbadmagicnumber;It‘snotabinarylogfilethatcanbeusedbythisversionofMySQL [ERROR]Can'tinittclog[ERROR]Aborting在Windows系统上,Mysql服务没启动,在启动Mysql服务时,报以下错误: 系统出错。 发生系......
  • 不能使用astyle对Linux的Kconfig和Makefile进行排版,会导致编译错误
    代码排版工具不同人代码的排版习惯不一样。遇到自己不喜欢的格式,看起来比较麻烦。可以使用astyle对代码进行排版。我喜欢以"otbs"格式的排版。命令如下:astyle-s--style=otbs*.castyle-s--style=otbs*.h错误排版一次使用时,不小心对所有文件进行了排版。hankf@XSZGS4......