cmake之configure_file指令

发布时间 2023-06-29 12:39:47作者: 凡璞

[! 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生成可执行文件