Cmake使用教程

一、速查手册

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 ) ,其作用类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值