Appx. I. CMake简单入门
简介
CMake是一个十分好用的构建系统,它可以帮助大家构建许多的C/C++应用程序。然而,CMake的配置方式十分复杂,网上的资料又令人眼花缭乱。这些困难经常让同学们望而却步。所以,本文将帮助大家轻松了解CMake的使用~
CMake基础
最基础的CMakeLists.txt模板
下面是一个最简单的CMakeLists.txt模板,使用它可以编译一个最简单的C++程序。
cmake_minimum_required(VERSION 3.5)
# Set the project name
project(hello_cmake)
# add executable files to the project
add_executable(${PROJECT_NAME} main.cpp main.h)
接下来,我们会一起来了解这些内容的含义,以及如何增加内容来满足我们的需求~
注释
与其他的编程语言一样,在CMake中同样可以使用注释。CMake中的注释符号是#。这个符号适用于一行文字的注释,下面是一个简单例子:
#This is a useless comment
#同样可以写中文
变量
CMake同样支持定义和使用变量!不过语法比较奇怪,需要大家慢慢来熟悉~ (´▽`)
变量的定义
在CMake当中,使用如下的语法来定义一个变量:
set(Name Value)
其中,Name是变量的名称,Value是变量的值。变量的值可以是字符串、数字或者是布尔值(True/False)等等。
例如,
# 定义一个布尔变量
set(MyBool True)
# 定义一个字符串 "SomeString"
set(MyString SomeString)
# 也可以带上引号
set(MyString2 "SomeString")
# 定义一些数字
set(MyNumber 123)
变量的访问
在CMake当中,使用下面的格式访问变量:
${Name}
其中,Name是变量名。
一些使用的例子如下:
message(${MyString}) # 打印变量的值
我们注意到,${Name}这个语句整体,其实就代表了这个变量的值了
添加源文件(.c/.cpp)
基本方法
在上面的最简单的例子当中,我们可以看到,
add_executable(${PROJECT_NAME} main.cpp)
这个语句是最简单的写法,它将当前目录(根目录)下的main.cpp文件添加到了编译目标里面。同时指定了生成的可执行文件(executable)名称为变量${PROJECT_NAME}的值。在上面的例子中,这个值就是hello_cmake。
高级方法
如果只有几个源文件,那么非常好解决!直接像上面的main.cpp一样手动添加进来就好~
可是,如果我们有许许多多的文件需要添加,手动修改的方式未免效率低下,同时也难以维护。因此,我们使用一种新的方法——通配符匹配!
这种方法的语法如下:
file(GLOB_RECURSE SOURCES *.cpp *.c)
上面这句话的意思是,在根目录下递归查找后缀是.cpp和.c的文件,并将结果保存在名为SOURCES的变量中。注意,这个变量的值是list类型的~
于是乎,我们用这个方法将项目所有目录下的源文件都添加进去:
file(GLOB_RECURSE SOURCES *.cpp *.c)
add_executable(${PROJECT_NAME} ${SOURCES})
这样就完成啦!
添加头文件(.h/.hpp)
基本方法
与添加源文件是一样的,头文件一样可以使用add_executable命令:
add_executable(${PROJECT_NAME} main.cpp main.h)
这样我们就将根目录里的main.h添加进去了。
高级方法
方法与上面添加源文件一样
file(GLOB_RECURSE HEADERS *.h *.hpp)
add_executable(${PROJECT_NAME} main.cpp ${HEADERS })
就不再过多解释了。
添加一个目录
大多数情况下,头文件都是放在了一个目录下面的,在这种情况下,我们只用包含这个目录就好:
include_directories(DirName)
其中,DirName是目录相对于根目录的地址。
比如,在项目的根目录下面有一个名为Inc的文件夹,其中有一些头文件:
include_directories(Inc)
如果有子目录的话,用法是一样的:
# 包含了 ./include/myapp 的文件夹
include_directories(include/myapp)
完整版基本配置
现在,大家已经学会了基本的CMake操作了,下面将会给出一个带注释的完整版本:
# 设置最低兼容的CMake版本
cmake_minimum_required(VERSION 3.18.2)
# 设置工程名称,储存在PROJECT_NAME变量中
project(hello_cmake)
# 包含了 ./include/myapp 的文件夹
include_directories(include/myapp)
# 查找根目录下的所有源文件
file(GLOB_RECURSE SOURCES *.cpp *.c)
# 添加可执行文件
add_executable(${PROJECT_NAME} ${SOURCES})