0. 引言
CMake是个一个开源的跨平台自动化建构系统,用来管理软件建置的程序,并不依赖于某特定编译器,并可支持多层目录、多个应用程序与多个库。
但是我在刚刚入手CMake时没有比较合适的介绍教程,CMake官网教程 中复杂的内容使得很多人难以静下心仔细学习,往往会最后放弃CMake的搭建环境,而目前有很多IDE都是基于CMake搭建或者支持CMake,例如我最喜欢的CLion,所以我总结后写下了这篇简短文档来介绍CMake的使用。
用CMake所必不可少的文档则是CMakeList.txt,本文将对CMakeList.txt的基本实现功能进行介绍,然后将对基本命令进行总结。
1. 如何使用CMake运行程序C/C++
我们以C程序为例,运行一个简单的C程序我们需要在CmakList.txt中写上以下代码:
cmake_minimum_required(VERSION 2.8) //指定CMake的最小版本
set(CMAKE_C_STANDARD 11) //C语言执行标准
project(app_project) //这个是你的总项目名称,可以自己定义
add_executable(myapp main.c) //myapp是run/debug的项目名称,可以自己定义
//值得注意的是,main.c是你的主函数
在这段代码中,add_executable()是核心所在,它决定了你将要执行什么代码,如果你又自定义了多个外部函数,那你应该将他们都加入该代码段中,比如:
add_executable(myapp main.c hello.c hello.h)
当你的项目比较大时,你可能又多个头文件以及外部函数文件,这个时候你可以通过归类,将你的头文件放到一个文件夹中,将外部函数文件再放入一个文件夹中。我们这里假设你将头文件都放入include文件夹中,将外部函数文件放入src文件中,这个时候我们可以这样写
cmake_minimum_required(VERSION 2.8)
project(app_project)
FILE(GLOB SCR ${PROJECT_SOURCE_DIR}/scr/*.c) //搜索所有src下的c文件
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include) //标记include文件为头文件夹
add_executable(myapp main.c ${SCR}) //注意这个时候一定要把${SCR}加入
C++与之类似,不再赘述
2. 如何使用CMake生成静态库(动态库)
当我们希望将自己的代码打包成静态库(动态库)供成其他模块引用的时候,则需要以下命令
add_library()
target_link_library()
我们仍然以上文所述例子为代表,通过代码来解释这个函数是如何使用的:
cmake_minimum_required(VERSION 2.8)
project(app_project)
FILE(GLOB SCR ${PROJECT_SOURCE_DIR}/scr/*.c)
FILE(GLOB HEADER ${PROJECT_SOURCE_DIR}/include/*.h)
add_library(pack ${SCR} ${HEARDER}) //将所需打包文件打包成静态库
之后build程序可创建libpack.a,如果希望封装成动态库,则可修改函数
add_library(pack SHARE ${SCR} ${HEARDER})
3. 如何使用CMake引入外部静态库(动态库)
当我们希望引用他人封装好的静态库(动态库)模块的时候,则需要以下命令
target_link_library()
下面我们根据上文所封装好的libpack.a
cmake_minimum_required(VERSION 2.8)
project(app_project)
target_link_library(myapp pack) //调用静态库中的libpack.a
add_executable(myapp main.c)
动态库相似,不再赘述
参考文献
[1] Kiefer M. CMake by Example[EB/OL]. Medium. 2018-06-27/2020-04-08. https://mirkokiefer.com/cmake-by-example-f95eb47d45b1.
[2] Dündar O. CMake Tutorial[EB/OL]. Medium. 2018-10-07/2020-04-08. https://medium.com/@onur.dundar1/cmake-tutorial-585dd180109b.
[3] CMake Tutorial — CMake 3.17.0 Documentation[EB/OL]. /2020-04-08. https://cmake.org/cmake/help/latest/guide/tutorial/index.html.
[4] Quick CMake Tutorial - Help | CLion[EB/OL]. /2020-04-08. https://www.jetbrains.com/help/clion/quick-cmake-tutorial.html.