目录
1. 介绍
Cmake是一个跨平台的安装编译工具,用简单的语句描述所有平台的安装。
Cmake是C++开源项目的标配。
通过编写一个CMakeLists.txt文件来完成。
2. 安装
tar -zxf cmake-3.18.3.tar.gz
cd cmake-3.18.3 && ./bootstrap --no-system-curl
make -j$(nproc) && make install
如果报错:缺少openssl,则可以编辑CMakeLists.txt,添加一行set(CMAKE_USE_OPENSSL OFF)
3. Cmake语法
3.1 语法特性
① 基本语法格式:指令(参数1 参数2 参数...)
说明:
(1)参数使用()括起来
(2)参数之间使用空格或者分号隔开
② 指令是大小写无关的,参数和变量是大小写相关的
③ 变量使用${变量名}方式取值,但是在if语句中直接使用变量if(变量名)
3.2 重要指令
指令 | 说明 | 示例 |
cmake_minimum_required | 指定Cmake最小版本要求 | # cmake版本最低要求2.8.1 cmake_minimum_reqred(VERSION 2.8.1) |
project() | 定义工程名称 | # 项目名称为test project(test) |
set(变量 值1 值2 ...) | 显示地定义变量 | # 定义SRC变量,它的值为a.cpp b.cpp c.cpp set(SRC a.cpp b.cpp c.cpp) |
include_directories(dir1 dir2 ...) | 添加头文件搜索目录,相当于-I选项,可以是相对路径也可以是绝对路径 | # 添加头文件搜索路径inc_dir1 inc_dir2 include_directories(inc_dir1 inc_dir2) |
link_directories | 添加库文件搜索目录,相当于-L选项,可以是相对路径也可以是绝对路径 | # 添加库文件搜索路径lib_dir1 lib_dir2 link_directories(lib_dir1 lib_dir2) |
add_library(libname [SHARED|STATIC] source1 source2 ...) | 生成库,第一个参数为生成库的名称,第二个为库的格式,常见的有动态库(SHARED)和静态库(STATIC),还有其他的不怎么用,第三个及以后的参数表示源文件,一般为c/c++文件 相当于-shared libxxx.so或者 ar -rc libxxx.a | # 将源文件add.cpp 生成动态库libadd.so add_library(add SHARED add.cpp) # 将源文件add.cpp 生成静态库libadd.a add_library(add STATIC add.cpp |
add_compile_options() | 设置编译选项 | # 设置c++11标准 add_compile_options(-std=c++11) |
add_executable(name src1 src2 ...) | 生成可执行程序,相当于-o | # 生成test add_executable(test main.cpp) |
target_link_libraries(name lib1 lib2 ...) | 连接库,相当于 -l选项(小写的L) | # 连接libadd.so target_link_libraries(test add) |
aux_source_directory | 发现一个目录下所有的源代码文件,并将列表存储在一个变量中 | # 将src目录下的源文件列表存储到 SRC_MATH变量中,并利用该变量生成动态库libmath.so aux_source_directory(src SRC_MATH) add_library(math SHARED ${SRC_MATH}) |
add_definitions() | 添加-D宏定义 | add_definitions(-DDebug) |
3.3 常用变量
变量名称 | 含义 | 示例 |
CMAKE_C_FLAGS CMAKE_CXX_FLAGS | gcc编译选项 g++编译选项 | # 在g++编译选项后追加-std=c++11 set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -std=c++11”) |
CMAKE_BUILD_TYPE | 编译类型(Debug/Release) | set(CMAKE_BUILD_TYPE Debug) |
CMAKE_C_COMPILER | 指定C编译器 | |
CMAKE_CXX_COMPILER | 指定C++编译器 | |
EXECUTABLE_OUTPUT_PATH | 可执行文件输出目录 | |
LIRBARY_OUTPUT_PATH | 库文件输出目录 | |
PROJECT_SOURCE_DIR 项目名称_SOURCE_DIR CMAKE_SOURCE_DIR | 项目顶层目录 |
4 Cmake编译项目
4.1 目录结构
项目顶层目录下存在一个CMakeLists.txt文件
4.2 编译流程
编写CMakeLists.txt文件
执行命令
cmake PATH
生成makefile文件(PATH为项目顶层CMakeLists.txt所在目录)
执行
make
进行编译
4.3 两种构建方法
4.3.1 内部构建(不推荐)
直接在CMakeLists.txt所在目录下执行
cmake .
会在当前目录生成很多cmake相关文件,所以不推荐
4.3.2 外部构建(推荐)
在CMakeLists.txt所在目录下创建目录,例如build,进入build下执行
cmake ..
会在build目录下生成相关文件,而不会影响源代码的目录结构
5. 参考
5.1 官网文档
https://cmake.org/cmake/help/latest/index.html#