CMake简介
- 全称Cross Platform Make,简称CMake
- 主要为了跨平台需求,Windows、Linux、Unix、Mac、iOS、Android
- 一款优秀的工程构建工具,类似工具有autotools等
- 为特定IDE构建工程项目,如CodeLite、CodeBlocks等跨平台开源IDE
- 编译生成目标可以使可执行文件,动静态库
CMake编译原理
- 利用cmake命令读取CMakeLIsts文件生成Makefile文件
- 利用make命令读取Makefile文件生成最终输出目标文件
编译想到的问题
- 如何组织项目的编译框架
- 最终输出的目标是什么,可执行程序,动态库,静态库
- 如何配置输出目标文件的指定编译参数,编译参数以及环境,源文件等等
- 如何指定输出目标连接参数,如内外部依赖,连接外部库等等
CMake语法主体
- 工程配置部分
# 包括工程名、编译调试模式、编译系统语言
# 指定CMake最低版本号要求
cmake_minimum_required (VERSION num)
# 项目信息
project (current_project_name)
# 设置编译版本 如“-std=c++11”、“-std=c++14”、“-std=c++17”、“-std=c++20”
set (CMAKE_CXX_FLAGS "-std=c++11")
# 设置编译模式,如“Debug”、“Release”
set (CMake_BUILD_TYPE "Debug")
- 依赖执行部分
# 包括工程包、头文件、依赖库等等
# 引入外部依赖
find_package (std_lib_name VERSION REQUIRED)
# 生成库(动、静)类型
add_library (<name> [lib_type] source1)
# 设置头文件路径
set (include_dir "${PROJECT_SOURCE_DIR}/include/")
# 指定头文件路径,必须在 add_executeable 前面
include_directories (${include_dir})
# 设置源代码路径
set (source_dir "${PROJECT_SOURCE_DIR}/src/")
# 设置需要编译的源文件
file (GLOB source_files "${source_dir}/*.cpp")
# 设置编译的输出目标文件
add_executable (HelloWorld ${source_files})
# 指定链接库路径,必须在 add_executeable 后面
target_link_libraries (${std_lib_name_LIBRARIES})
- 其他辅助部分
# 包括参数打印、遍历目录等等
- 判断控制部分
# 条件判断、函数定义、条件执行等等
CMake常用实例
工程文件目录配置
采用外部编译,首先进入build文件目录,使用cmake命令,然后使用make命令
# 读取并执行顶层cmakelists配置文件
cmake ..
# 直接make读取并编译Makefile文件
make
.
|——build
|——CMakeLists.txt
|——include
|
|——hello.h
|——src
|
|——hello.cpp
|——main.cpp
实例1
在Ubuntu系统中为CodeLite IDE创建工程项目
# 0、前期工具准备
# 更新系统软件源
sudo apt update
# 更新系统的软件
sudo apt upgrade
# 安装vim、g++、cmake、codelite软件工具
sudo apt install vim g++ cmake codelite
# 1、前期文件目录准备
# 创建Dev空文件目录,项目开发顶级目录
mkdir Dev
# 进入Dev文件目录
cd Dev
# 创建HelloWorld空文件目录,项目开发中的模块目录
mkdir HelloWorld
# 进入HelloWorld空文件目录
cd HelloWorld
# 创建src空文件目录,储存模块的源代码目录
mkdir src
# 创建项目的主程序源代码文件
touch src/Main.cpp
# 2、配置CMake的配置文件CMakeLists.txt
vim CMakeLists.txt
# 设置CMake最低要求版本
cmake_minimum_required (VERSION 3.5)
# 设置项目名
project (HelloWorld)
# 设置编译参数
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Werror -std=c++11")
# 设置源代码文件目录
set (source_dir "${PROJECT_SOURCE_DIR}/src/")
# 设置需要编译的源文件
file (GLOB source_files "${source_dir}/*.cpp")
# 设置编译的输出目标文件
add_executable (HelloWorld ${source_files})
# 3、生成项目
# 创建脚本自动运行
vim build.sh
# 脚本内容
#!/bin/sh
# 为CodeLite IDE创建项目工程,并自动生成Makefile文件
cmake -G "CodeLite - Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug
# 为脚本添加可执行权限
chmod +x build.sh
# 运行shell脚本
./build.sh
# 查看脚本运行结果
ls
# 利用IDE CodeLite 以后台方式打开工程项目
codelite HelloWorld.workspace &