cmake详细教程(概念版)_cmakelists怎么用

一、参考资料

CMake文档

CMakeLists 入门

【CMake】CMakeLists.txt的超傻瓜手把手教程(附实例源码)

二、相关介绍

1. CMakeLists

1.1 CMakeLists简介

CMakeLists是有条理的gcc编译命令的文件,利用make工具来执行CMakeLists文件的编译指令。

# 设置cmake最低版本
cmake_minimum_required(VERSION 3.2)

# project命令用于指定cmake工程的名称,实际上,它还可以指定cmake工程的版本号(VERSION关键字)、简短的描述(DESCRIPTION关键字)、主页URL(HOMEPAGE_URL关键字)和编译工程使用的语言(LANGUAGES关键字)
# project(<PROJECT-NAME> [<language-name>...])
# ${PROJECT_NAME}:本CMakeLists.txt的project名称
project(xxx)

# project(<PROJECT-NAME> [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]] [DESCRIPTION <project-description-string>][HOMEPAGE_URL <url-string>] [LANGUAGES <language-name>...])
project(mytest VERSION 1.2.3.4)
project (mytest HOMEPAGE_URL “https://www.XXX(示例).com”)

# 获取路径下所有的.cpp/.c/.cc文件(不包括子目录),并赋值给变量中
aux_source_directory(路径 变量)

# ${PROJECT_SOURCE_DIR} 和 <PROJECT-NAME>_SOURCE_DIR:本CMakeLists.txt所在的文件夹路径

# GLOB_RECURSE 获取目录下的所有cpp文件(不包括子目录),并赋值给SOURCES
file(
        GLOB SOURCES
        ${PROJECT_SOURCE_DIR}/*.c
)
# GLOB_RECURSE 获取目录下的所有cpp文件(包括子目录),并赋值给NATIVE_SRC
file(
      GLOB_RECURSE NATIVE_SRC 
      ${PROJECT_SOURCE_DIR}/lib/*.cpp
)

# 设置变量,给文件名/路径名或其他字符串起别名,用${变量}获取变量内容
set(变量 文件名/路径/...)

# 添加编译选项FOO BAR
# add_definitions定义宏,但是这种定义方式无法给宏具体值 等价C语言中的#define  MG_ENABLE_OPENSSL
add_definitions(-DFOO -DBAR ...)

# add_compile_definitions定义宏,这种方式可以给宏具体值,但是这个指令只要高版本的cmake支持 等价C语言中 #define  MG_ENABLE_OPENSSL   1 
add_compile_definitions(MG_ENABLE_OPENSSL=1)

# 打印消息
message(消息)

# 编译子文件夹的CMakeLists.txt
add_subdirectory(子文件夹名称)

# 将.cpp/.c/.cc文件生成.a静态库
# 注意,库文件名称通常为libxxx.so,在这里只要写xxx即可
add_library(库文件名称 STATIC 文件)

# 将.cpp/.c/.cc文件生成可执行文件
add_executable(可执行文件名称 文件)

# 规定.h头文件路径
include_directories(路径)

# 规定.so/.a库文件路径
link_directories(路径)

# 设置编译选项及默认值
option(TEST_DEBUG "option for debug" OFF)

# 对add_library或add_executable生成的文件进行链接操作
# 注意,库文件名称通常为libxxx.so,在这里只要写xxx即可
target_link_libraries(库文件名称/可执行文件名称 链接的库文件名称)

1.2 CMakeLists.txt文件结构
project(xxx)                                          #必须

add_subdirectory(子文件夹名称)                         #父目录必须,子目录不必

add_library(库文件名称 STATIC 文件)                    #通常子目录(二选一)
add_executable(可执行文件名称 文件)                     #通常父目录(二选一)

include_directories(路径)                              #必须
link_directories(路径)                                 #必须

target_link_libraries(库文件名称/可执行文件名称 链接的库文件名称)       #必须

1.3 CMakeLists.txt示例
# 指定cmake版本
cmake_minimum_required(VERSION 3.0)

# 设置项目名称
project(SOLIDERFIRE)

# 添加编译参数
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O2 -Wall")

# 设置代码构建级别为 Debug 方式
set(CMAKE_BUILD_TYPE Debug)

# 包含目录
include_directories(${CMAKE_SOURCE_DIR}/include)

# 编译
add_executable(a.out main.cpp src/Gun.cpp src/Solider.cpp)

1.4 build文件夹

为了简单起见,cmake 采用 out-of-source 方式构建(即生成中间产物与源代码分离),即创建 build 文件夹用于编译。

mkdir build
cd build

# cmake工具生成CMakeLists.txt文件
cmake ..

# 多进程编译
# make编译根据CMakeLists.txt文件进行编译
make -j$(nproc)

+
| 
+--- main.c
+--- CMakeLists.txt
|
/--+ build/
   |
   +--- hello(exec)

2. CMake工具

2.1 CMake工具简介

CMake 是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile 或者 project 文件,CMake 的配置文件取名为 CMakeLists.txt。也就是在 CMakeLists.txt 这个文件中写 cmake 代码。 简单理解,cmake 就是将多个 cpp、hpp 文件组合构建为一个大工程的语言

cmake 编写的过程实际上是编程的过程,每个项目使用一个 CMakeLists.txt(每个目录一个),使用的是 cmake 语法。

2.2 CMake工具优势
  • 跨平台,并可以生成 native 编译配置文件,在 Linux/Unix 平台,生成 makefile;在苹果平台可以生成 Xcode;在Windows 平台,可以生成 MSVC 的工程文件。
  • 能够管理大型项目
  • 简化编译构建过程和编译过程。cmake 的工具链非常简单:cmake + make。
  • 可扩展,可以为 cmake 编写特定功能的模块,扩展 cmake 功能。
    在这里插入图片描述
2.3 CMake跨平台

cmake中有一个概念叫 cmake generator生成器,cmake生成器支持不同的生成器,例如:Makefile系列、Ninja系列等。要产生Ninja,加上 -G Ninja 即可:

cmake -G Ninja

但cmake提供了一个统一的命令接口,不管底层是啥,直接用以下指令即可:

cmake --build .

简单理解,不管你用什么生成器,cmake都能正确构建,实现真正的跨平台。

2.4 cmake编译
cmake --build . --config Release --target check

2.5 make编译
# 多线程编译
make -j4 -l4

参数解释

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值