[! 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_NAME
、projName_VERSION_MAJOR
、projName_VERSION_MINOR
上面的projName
可以就是实实在在的项目名称"projName";也可以只是一个代指,若是是一个代指的话,projName_VERSION_MAJOR
、projName_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生成可执行文件