- 内容参考:HaHack:CMake 入门实战
编译流程
Win + CMake + MinGW
- 编写源码和CMakeLists.txt
- 在源码路径下新建子目录
build
,并进入 - 执行命令
cmake -G “MinGW Makefiles” ..
:win下只生成Makefiles,省得出现各种vs sln文件 - 执行命令
mingw32-make
即可生成exe - 运行
project.exe
Linux + CMake
- 编写源码和CMakeLists.txt
- 在源码路径下新建子目录
build
,并进入 - 执行命令
cmake ..”
:默认生成Makefiles - 执行命令
make
即可 - 运行
project
Linux中可执行文件无后缀
基本语法
CMakeLists.txt 的语法比较简单,由命令、注释和空格组成。符号 # 后面的内容被认为是注释。命令由命令名称、小括号和参数组成,参数之间使用空格进行间隔。其中命令是不区分大小写的,但是命令中的参数或者说变量都是区分大小写的。
单目录工程
# 最低版本号要求
cmake_minimum_required(VERSION 3.15)
# 应用的C++标准
set(CMAKE_CXX_STANDARD 11)
# 工程名
project(Demo)
# 添加生成目标
add_executable(Demo main.cpp other.cpp)
同一目录下,用到了多少个cpp文件就添加多少个,不用管头文件。如果想省事可以使用 aux_source_directory
(不推荐,不能检测目标文件的变动,而cmake需要实时载入)
多目录工程
主目录:
# 最低版本号要求
cmake_minimum_required(VERSION 3.15)
# 应用的C++标准
set(CMAKE_CXX_STANDARD 11)
# 工程名
project(Demo)
# 添加子目录
add_subdirectory(module1)
add_subdirectory(module2)
# 添加生成目标
add_executable(Demo main.cpp)
# 链接库
target_link_libraries(Demo Module1 Module2)
- 需要添加子目录
- 需要在 add_executable 后链接由子目录生成的静态链接库
子目录:
# 最低版本号要求
cmake_minimum_required(VERSION 3.15)
# 查找所有源文件,并将名称保存到 SRC_DIR 变量
aux_source_directory(. SRC_DIR)
# 生成静态链接库以供调用,参数为 STATIC
add_library(Module1 STATIC ${SRC_DIR})
每一个子目录都要这样
多目录多工程
文件结构:
workspace
├── cmake-build-debug
├── CMakeLists.txt
├── demo1
│ ├── CMakeLists.txt
│ └── main.cpp
└── demo2
├── CMakeLists.txt
└── main.cpp
主目录:
cmake_minimum_required(VERSION 3.8)
project(workspace)
add_subdirectory(demo1)
add_subdirectory(demo2)
Demo1:
cmake_minimum_required(VERSION 3.8)
project(demo1)
set(CMAKE_CXX_STANDARD 17)
aux_source_directory(. SRC)
add_executable(demo1 ${SRC})
Demo2:
cmake_minimum_required(VERSION 3.8)
project(demo2)
set(CMAKE_CXX_STANDARD 17)
aux_source_directory(. SRC)
add_executable(demo2 ${SRC})
第三方库
见如下的OpenCV代码示例
Linux 下 OpenCV + CMake
Linux下编译OpenCV库:
- 新建opencv文件夹,并进入
- 下载OpenCV源代码:在 gitee 中同步最新的源码仓库,下载到本地
- 解压
unzip opencv-master.zip unzip opencv_contrib-master.zip
- 编译
mkdir build cd build cmake -DDOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.5.1/ ../opencv-4.5.1/ make -j 8
- 配置环境变量
cd /etc vi bashrc # 在文件后追加 export OpenCV_DIR=/root/libs/opencv/build/ export PATH=$PATH:$OpenCV_DIR source bashrc
使用CMake构建测试项目
- main.cpp
#include <iostream> #include <opencv2/opencv.hpp> using namespace std; int main(){ cv::Mat mat(400,300,CV_8UC3,cv::Scalar(255,200,0)); cout << "Hello, OpenCV!" << endl; return 0; }
- CMakeLists.txt
# 最低版本要求 cmake_minimum_required(VERSION 3.10) # 应用的C++标准 set(CMAKE_CXX_STANDARD 11) # 添加第三方库 find_package(OpenCV REQUIRED) # 添加生成目标 add_executable(Test main.cpp) # 链接库 target_link_libraries(Test ${OpenCV_LIBS})
- 执行:
mkdir build cd build cmake .. make ./Test
如果不想添加环境变量,就手动在CMakeLists.txt指定 OpenCV_DIR的路径,并在运行时添加动态库的参数。如在CLion中执行则需要设置如下参数:
平台选择
类UNIX操作系统对应关键词 UNIX
,微软Windows对应WIN32
IF (UNIX)
set(OpenCV_DIR "~/opencv/build")
set(Torch_DIR "~/libtorch/share/cmake/Torch")
ELSEIF (WIN32)
set(OpenCV_DIR "D:/opencv/build")
set(Torch_DIR "D:/PyTorch/libtorch/share/cmake/Torch")
ENDIF ()