CMake简易使用

本文最后更新于:9 个月前

基本语法

通过编写平台无关的CMakeLists.txt文件来定制整个编译流程,然后执行之,根据目标平台生成所需的Makefile文件.流程如下:

  1. 编写CMake配置文件CMakeLists.txt;
  2. 执行命令cmake path或选择带交互式界面的ccmake path,path是CMakeLists.txt所在的目录;
  3. 生成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
2
3
4
5
6
7
8
9
10
11
12
13
.
├── bin
│ └── main
├── build
├── CMakeLists.txt
├── config.h.in
├── include
│ ├── config.h
│ └── xmath.h
├── lib
│ └── libxmath.a
└── src
└── main.cpp
  • bin目录用来存放生成的可执行文件
  • build目录用以执行cmake .. && make
  • include目录用以放置头文件,故基本上扫描的头文件路径就是它
  • lib目录放置的是自己编写的静态/动态库,这是由另外的进行生成,我试着把库生成和main.cpp写在一个项目,但是在执行make的时候总出错,应该是我编写的问题,后续修改这个问题
  • src目录用以放置源文件
  • config.h.in文件装放的是一些对源文件编译有影响的cmake中的变量,在cmake .. 的时候会生成config.h,转换为C可用的宏定义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cmake_minimum_required(VERSION 2.8)
project(final_demo)
add_compile_options(-Wall -std=c++11)

option(MYMATH "USE MY POW FUNCTION" ON)

configure_file(${PROJECT_SOURCE_DIR}/config.h.in ${PROJECT_SOURCE_DIR}/include/config.h)
include_directories(${PROJECT_SOURCE_DIR}/include)

if(MYMATH)
# add_subdirectory(${PROJECT_SOURCE_DIR}/src/math)
endif()

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC_CPP)
add_executable(main ${SRC_CPP})
if(MYMATH)
target_link_libraries(main ${PROJECT_SOURCE_DIR}/lib/libxmath.a)
endif()

参考文件


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!