CMake 学习笔记

  • cmake

基本使用

1)初始文件:hello.c,CMakeList.txt

2)CMakeList.txt

1
2
3
4
5
6
7
8
# CMake最低版本要求
cmake_minimum_required(VERSION 2.8)

# 工程名
project(HelloProject)

# 最终要生成的elf文件名为hello,源文件为:hello.c
add_executable(hello hello.c)

3)cmake编译

1
cmake .

得到:CMakeFiles文件夹,CMakeCache.txt,cmake_install.cmake,Makefile

1
make

得到目标文件 hello

同目录多源文件编译

添加文件 test.c ,test.h ,test.h中的方法是对test.c中的函数方法的声明,hello.c引入test.h头文件,并调用头文件中的方法。

则,调整 CMakeList.txt 文件:

1
2
# 在参数表中增加testFunc.c
add_executable(hello hello.c testFunc.c)

当需要编译的文件很多时,使用命令 aux_source_directory(< dir > < variable >) 将指定目录下所有源文件存储到一个变量中进行操作,可以避免大量手动罗列

1
2
3
4
# 将当前所在目录下的所有源文件 . ,添加到 变量SRC_LIST中
aux_source_directory(. SRC_LIST)
# 调用变量SRC_LIST,语法类似Makefile
add_executable(hello ${SRC_LIST})

不同目录多源文件编译

要编译的文件在不同目录下时,使用命令 include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...]) 向工程添加多个指定头文件的搜索路径

1
2
3
4
5
6
7
8
# 将头文件包含进工程
# 等价于包含头文件 include "xx.h"
include_directories (test_func test_func1)
# 添加源文件到变量中
aux_source_directory (test_func SRC_LIST)
aux_source_directory (test_func1 SRC_LIST1)
# 添加构成执行文件的所有文件
add_executable (hello hello.c ${SRC_LIST} ${SRC_LIST1})

工程目录编译

include目录中是所有的.h头文件,src目录中是所有的.c源文件,build文件夹时编译文件夹

  • [ ] 使用命令 add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL]) 来增加一个子目录进行编译,该文件夹下的CMakeLists.txt 负责编译该文件夹下的源码。source_dir选项指定了CMakeLists.txt源文件和代码文件的位置,binary_dir选项指定了输出文件的路径
1
2
# 在build目录下增加src子目录进行编译,src中的CMakeLists.txt编译src中的源文件
add_subdirectory (src)

在src目录下CMakeLists.txt中:

1
2
3
4
5
aux_source_directory (. SRC_LIST)
include_directories (../include)
add_executable (hello ${SRC_LIST})
# 位置变量 EXECUTABLE_OUTPUT_PATH 设置为 PROJECT_SOURCE_DIR/bin(工程根目录下的bin目录)
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

在build目录下 cmake

函数

find_package()

​ 在一些目录中查找(按照CMake规则)文件,例如OpenCV,将找到的头文件目录设置到变量${OpenCV_INCLUDE_DIES}中,将链接库设置到 ${OpenCV_LIBS}中

​ 查找方式:模块模式 / 配置模式

1. 模块模式:查找Find<package>.cmake文件(由CMAKE_MODULE_PATH 指定)
 2. 配置模式:查找一个由待查找的包提供的配置文件的位置。包含该文件的路径被存储到 <package>_DIR的cache的条目里。

不管哪一种模式,只要找到包,就会定义变量

_ FOUND

INCLUDE DIRS 或者 _ INCLUDES

LIBRARIES 或者 LIBS

_ DEFINITIONS

​ find_package() + add_library() 得到库文件的绝对路径

​ 指定第三方库所在路径,使得cmake搜索到动态库

​ 将目标文件与库文件进行连接

find_path() / find_library()

​ 寻找头文件和库文件

CMake预定义的变量

CMAKE_CURRENT_SOURCE_DIR

当前处理的CMakeLists.txt所在的目录

CMAKE_CURRENT_LIST_DIR

当前正在处理的列表文件的目录