一、速查手册
1. 常用命令
命令 | 作用 |
---|---|
cmake .. |
使用默认参数执行构建 |
cmake -DCMAKE_BUILD_TYPE=Debug .. |
构建带调试信息的程序或库 |
cmake -DCMAKE_INSTALL_PREFIX=install .. |
编译时指定安装目录 |
cmake -DCMAKE_PREFIX_PATH=thirdparty .. |
编译时指定搜索根目录 |
cmake -G Ninja .. |
指定生成器为Ninja |
cmake --build . |
根据默认构建系统生成程序 |
cmake -version |
查看cmake版本 |
-B
用于指定构建目录-D
用于定义Cmake变量-E
调用Cmake内置命令的参数-G
用于指定生成器-S
用于指定源代码目录,此目录包含了CMakeLists.txt
文件
2. 常用变量
变量名 | 含义 |
---|---|
CMAKE_SOURCE_DIR | 最顶层CmakeLists.txt所在目录,CHAN |
CMAKE_CURRENT_SOURCE_DIR | 当前CMakeLists.txt 所在路径 |
PROJECT_SOURCE_DIR | 工程的根目录 |
CMAKE_ARCHIVE_OUTPUT_DIRECTORY | 静态库的输出目录 |
CMAKE_LIBRARY_OUTPUT_DIRECTORY | 动态库的输出目录 |
CMAKE_RUNTIME_OUTPUT_DIRECTORY | 可执行文件的输出路径 |
3. 基本模板
cmake_minimum_required (VERSION 3.5)
project (Test)
# 设置头文件目录
include_directories(${PROJECT_SOURCE_DIR}/inc INC_DIR)
# 设置源文件目录
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC_DIR)
# 添加可执行文件
add_executable(helloworld hello.cpp)
# 链接库
target_link_libraries(helloworld ${CMAKE_SOURCE_DIR}/add.a)
cmake_minimum_required (VERSION 3.5)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
project (Test)
# 设置头文件目录
include_directories(${PROJECT_SOURCE_DIR}/inc INC_DIR)
# 设置源文件目录
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC_DIR)
# 添加可执行文件
add_executable(helloworld hello.cpp)
# 链接库
target_link_libraries(helloworld ${CMAKE_SOURCE_DIR}/add.a)
二、基本用法
1. 单个源文件
1.1 目录结构
.
├── build
├── CMakeLists.txt
└── hello.cpp
1.2 CmakeLists.txt
cmake_minimum_required (VERSION 3.5)
project (LearnCmake)
add_executable(helloworld hello.cpp)
1.3 编译步骤
cd build
cmake ..
make
2. 多个源文件
2.1 目录结构
Project
├── build
├── add.cpp
├── add.hpp
├── CMakeLists.txt
└── hello.cpp
2.2 CmakeLists.txt
cmake_minimum_required (VERSION 3.5)
project (LearnCmake)
add_executable(helloworld hello.cpp add.cpp)
2.3 编译步骤
cd build
cmake ..
make
3. 编译动态库
3.1 目录结构
├── build
├── CMakeLists.txt
├── hello.cpp
├── hello.hpp
└── main.cpp
3.2 CmakeLists.txt
cmake_minimum_required (VERSION 3.5)
project (LearnCmake)
# 创建共享库目标
add_library(hello SHARED hello.hpp hello.cpp)
# 设置库的最终生成路径
set(LIBRARY_OUTPUT_PATH ./lib)
3.3 编译步骤
cd build
cmake ..
make
4. 编译静态库
4.1 目录结构
Project
├── build
├── CMakeLists.txt
├── hello.cpp
├── hello.hpp
└── main.cpp
4.2 CmakeLists.txt
cmake_minimum_required (VERSION 3.5)
project (LearnCmake)
# 创建共享库目标
add_library(hello STATIC hello.hpp hello.cpp)
# 设置库的最终生成路径
set(LIBRARY_OUTPUT_PATH ./lib)
4.3 编译步骤
cd build
cmake ..
make
5. 综合案例
5.1 目录结构
Project
├── build/
├── CMakeLists.txt
├── inc/
│ └── hello.hpp
├── src/
│ ├── hello.cpp
│ └── main.cpp
└── thirdparty/
├── opencv4/
└── eigen/
5.2 CmakeLists.txt
# 设置最低版本
cmake_minimum_required (VERSION 3.5)
# 设置项目名称
project (LearnCmake)
# 设置OpenCV库的路径
set(OpenCV_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/thirdparty/opencv/include")
set(OpenCV_LIBS
"${CMAKE_SOURCE_DIR}/thirdparty/opencv/lib/opencv_core.lib"
"${CMAKE_SOURCE_DIR}/thirdparty/opencv/lib/opencv_imgproc.lib"
"${CMAKE_SOURCE_DIR}/thirdparty/opencv/lib/opencv_highgui.lib"
)
# 设置头文件目录
include_directories(
${PROJECT_SOURCE_DIR}/inc
${OpenCV_INCLUDE_DIRS}
)
# 设置源文件目录
aux_source_directory(${PROJECT_SOURCE_DIR}/src SRC_DIR)
# 创建共享库目标
add_library(hello_shared SHARED ${SRC_DIR})
# 创建静态库目标
add_library(hello_static STATIC ${SRC_DIR})
# 设置库的最终生成路径
set(LIBRARY_OUTPUT_PATH ../lib)
# 创建可执行文件
add_executable(main main.cpp)
# 链接库文件
target_link_libraries(main hello_static ${OpenCV_LIBS})
5.3 编译步骤
mkdir -p build
cd build
cmake ..
cmake --build .
三、进阶用法
1. 编译选项
有时因为一些特殊需要,为了实现自定义的编译,我们需要指定编译选项,这时我们可使用 add_compile_options
来添加编译选项,如下:
add_compile_options(-std=c++11 -Wall)
2. 控制选项
有时希望在编译代码时只编译一些指定的源码,可以使用cmake的option命令,主要遇到的情况分为2种:
- 本来要生成多个bin或库文件,现在只想生成部分指定的bin或库文件
- 对于同一个bin文件,只想编译其中部分代码(使用宏来控制)
3. 设置目录
aux_source_directory(dir var)
可把dir目录中的所有源文件都储存在var变量中include_directories ( dir )
,其作用类