CMake简易使用
本文最后更新于:9 个月前
基本语法
通过编写平台无关的CMakeLists.txt文件来定制整个编译流程,然后执行之,根据目标平台生成所需的Makefile文件.流程如下:
- 编写CMake配置文件CMakeLists.txt;
- 执行命令
cmake path
或选择带交互式界面的ccmake path
,path
是CMakeLists.txt所在的目录; - 生成Makefile后使用
make
命令进行编译;
因此采用CMake进行C++项目工程编译的关键在于编写CMakeLists.txt配置文件
CMakeLists.txt
主要由命令,注释,空格组成,其中命令不区分大小写,#
后跟着注释
命令由命令名称,小括号,参数组成,参数用空格间隔开
常用命令
-
cmake_minimum_required(VERSION X.X)
: 运行此配置文件所需的cmake最低版本; -
project(projectName)
: 指明项目名称; -
add_executable()
: 将源文件(放后面)编译成可执行文件(放前面) -
aux_source_directory(<dir> <variable>)
: 指定dir,会获取该目录下的所有源文件,将结果存入变量variable中(通过${}调用变量) -
add_subdirectory()
: 增加编译子目录,会去编译子目录下的CMakeLists.txt
文件 -
target_link_libraries()
: 参数第一个放可执行文件,后面放链接库的库名,可能是自己的库 -
add_library()
: 生成链接库,跟add_executable一样,生成的库名放前面,后面放的是源文件 -
configure_file(<input> <output>)
: 将输入的配置文件,一般是config.h.in
,里面编写了一些#cmakedefine ...
语句,让CMakeLists.txt
中的变量转换为宏定义,转换后的文件为output
,里面的宏定义可以在代码中通过#include ...
引入 -
option(<variable> "<help_text>" [value])
定义一个变量,中间的是描述变量的作用,value可以写ON/OFF,不写则默认OFF,可以跟CMakeLists.txt
中的if()...endif()
一类的搭配使用,还可以和上面的配置文件搭配使用 -
set(<variable> value1 value2 ...)
用来定义变量 -
include_directories()
用以增加需要扫描的头文件路径 -
find_package(<variable> library_name HINTS <dir>)
查找指定目录下的名为library_name
的库,在编译前便会进行查找,而非到链接阶段再去看有没有库注:实质上
find_package
一般用作寻找系统中安装的第三方库并进行链接,找的是xxxConfig.cmake
这种包配置文件,比如找OpenCV的OpenCVConfig.cmake
.一般的使用形式是:find_package(OpenCV REQUIRED) # 查找名为opencv的包,找不到就报错,会终止当前的cmake进程不再执行.
参考文件:
-
message()
可以在打印CMakeLists
中的变量或是提示信息
预定义变量
参见最后一篇的参考文件,预定义变量对我们的项目工程排布有很大作用,需要记住常用的
通用模板
目前所采用的项目目录结构如下:
1 |
|
- bin目录用来存放生成的可执行文件
- build目录用以执行
cmake .. && make
- include目录用以放置头文件,故基本上扫描的头文件路径就是它
- lib目录放置的是自己编写的静态/动态库,这是由另外的进行生成,我试着把库生成和main.cpp写在一个项目,但是在执行make的时候总出错,应该是我编写的问题,后续修改这个问题
- src目录用以放置源文件
config.h.in
文件装放的是一些对源文件编译有影响的cmake中的变量,在cmake ..
的时候会生成config.h,转换为C可用的宏定义
1 |
|
参考文件
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!