Cmake 学习笔记1 cmake初探与参数传递

最近需要在github上看一些项目,发现很多项目都是cmake编写的,看起来一头雾水,所以最近学习了下cmake相关的知识,在这个系列里记录下学习的痕迹。

最简单的cmake程序

首先cmake是一个自动化的构建,某种程度上可以理解为对makefile的一种封装,即可以通过更简便的方式来进行编译。

首先需要在文件夹下新建一个CMakeLists.txt,输入一下内容,这就是最简单的一个cmake文件

1
2
3
4
5
6
7
#指定最低cmake版本
cmake_minimum_required(VERSION 3.10)
#项目名
project(GYYPro )
#生成可执行文件(项目名 源文件)
add_executable(GYYPro tutorial.cxx)

之后新建一个build文件夹,并在里面运行cmake指令如下,当然也可以直接cmake,只不过为了文件夹看起来简洁易懂所以新建一个build文件夹,我认为这是个好习惯。

1
2
3
mkdir build
cd build
cmake ..

运行完成之后便可以发现在文件夹下生成了一堆文件,其中包含一个makefile文件,之后便可以通过make或者cmake --build来进行编译

cmake --build的作用我认为是用作跨平台的方便使用,在unix下跟make没啥差别,具体可以参考这个博客 https://blog.csdn.net/itworld123/article/details/123862402

编译完成后即可运行程序。

传递参数

cmake也可以完成参数的传递,如我想定义一个版本号的参数 #define GYY_VERSION 1,其实我可以直接写在头文件里,但是cmake也提供了另一种简便的方式。

首先新建文件gyypro.h.in,输入一行代码

1
#define GYY_VERSION @GYYPro_VERSION@

在刚才的cmake文件最后添加如下三行

1
2
3
4
5
6
7

#设置变量
set(GYYPro_VERSION 1)
#配置文件
configure_file(gyypro.h.in gyypro.h)
#设置include路径
target_include_directories(GYYPro PUBLIC "${PROJECT_BINARY_DIR}")

其中第一行定义了变量GYYPro_VERSION 的值为1.

第二行配置文件,configure_file(gyypro.h.in gyypro.h)的作用就是将gyypro.h.in文件复制到gyypro.h.in,并将里面的变量进行替换,在这里就是把@GYYPro_VERSION@替换为刚才定义的值1.configue_file的详解可以参考这个博客https://blog.csdn.net/heleneveryday/article/details/118696085

第三行的作用就是定义头文件的搜索路径,configure_file生成在当前目录下,也就是build下,所以需要把build目录加到include路径里,当然也可以给configure_file加路径,使得头文件声称在源代码路径里(但是这样会破坏原来的文件结构,给源项目增加文件,我觉得不可取).

target_include_directories有一个参数是PUBLIC,除了PUBLIC之外还有PRIVATE和INTERFACE,具体区别还比较复杂我觉得,可以参考以下博客https://zhuanlan.zhihu.com/p/82244559

通过以上三行,就可以完成参数的传递。