CMake 项目实践


编译流程

Win + CMake + MinGW

参考:Win10 + CMake + MinGW 简单使用

  1. 编写源码和CMakeLists.txt
  2. 在源码路径下新建子目录 build,并进入
  3. 执行命令 cmake -G “MinGW Makefiles” .. :win下只生成Makefiles,省得出现各种vs sln文件
  4. 执行命令 mingw32-make 即可生成exe
  5. 运行 project.exe

Linux + CMake

  1. 编写源码和CMakeLists.txt
  2. 在源码路径下新建子目录 build,并进入
  3. 执行命令 cmake ..” :默认生成Makefiles
  4. 执行命令 make 即可
  5. 运行 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库:

  1. 新建opencv文件夹,并进入
  2. 下载OpenCV源代码:在 gitee 中同步最新的源码仓库,下载到本地
  3. 解压
    unzip opencv-master.zip
    unzip opencv_contrib-master.zip
    
  4. 编译
    mkdir build
    cd build
    cmake -DDOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.5.1/ ../opencv-4.5.1/
    make -j 8
    
  5. 配置环境变量
     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 ()
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值