cmake-入门篇

1 什么是CMake?

Cmake是一个编译、构建工具。使用CMakeLists.txt来描述构建过程,可以生成标准的构建文件,如Makefile。一般先编写CMakeLists.txt,然后通过cmake来生成Makefile,最后执行make进行编译。

1.1 cmake安装

​ 在ubuntu上安装cmake非常简单,执行sudo apt-get install cmake即可。如果想安装最新的cmake版本,就需要自己进行源码编译安装。源码下载。源码编译安装非常简单,这里就不再详细描述了。

1.2 查看cmake版本

cmake安装完成后,执行cmake --version,即可查看cmake的版本号。我的是3.13.2

2 CMake的基本使用流程

  • 编写CMakeLists.txt
  • 执行cmake .;一般在工程根目录下mkdir build;cd build;然后执行cmake ..;这样的目的是为了保证源码不会污染
  • 执行make进行编译

3 CMake简单示例

这里给出一个简单的使用cmake进行构建的工程示例,目录结构如下:

test01
​ ├── build
​ ├── CMakeLists.txt
​ └── main.c

main.c文件如下:

#include <stdio.h>

int main(int argc, char** argv)
{
	printf("hello cmake\n");
	return 0;
}

CMakeLists.txt内容如下:

#设置cmake的最小版本
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
cmake_policy(SET CMP0048 NEW)
#设置项目名称
project(test01 VERSION "1.2.3.4")

# 获取项目名
message(${PROJECT_NAME})
message(${CMAKE_PROJECT_NAME})

# 获取项目源码目录
message(${PROJECT_SOURCE_DIR})
message(${test01_SOURCE_DIR})

# 获取build目录
message(${PROJECT_BINARY_DIR})
message(${test01_BINARY_DIR})

# 获取全版本号
message(${PROJECT_VERSION})
message(${test01_VERSION})

# 获取主版本号
message(${CMAKE_PROJECT_VERSION})

message(${PROJECT_VERSION_MAJOR})
message(${test01_VERSION_MAJOR})

message(${PROJECT_VERSION_MINOR})
message(${test01_VERSION_MINOR})

message(${PROJECT_VERSION_PATCH})
message(${test01_VERSION_PATCH})

message(${PROJECT_VERSION_TWEAK})
message(${test01_VERSION_TWEAK})

message(${CMAKE_CURRENT_SOURCE_DIR})
message(${CMAKE_CURRENT_BINARY_DIR})
#设置源文件
aux_source_directory(. dir_srcs)
message(${dir_srcs})
#设置可执行程序
add_executable(hello ${dir_srcs})

我这里mkdir 了build 目录,

cd build

cmake …

make

最后就会在当前目录下看到生成的test01可执行程序。

接下来,对上例中的CMakeLists.txt的语法进行解释。

  • CMakeLists.txt 的语法比较简单,由命令、注释和空格组成,其中命令是不区分大小写的,符号"#"后面的内容被认为是注释

    Call the cmake_minimum_required() command at the beginning of the top-level CMakeLists.txt file even before calling the project() command. It is important to establish version and policy settings before invoking other commands whose behavior they may affect. See also policy CMP0000.

  • cmake_minimun_required

    格式:cmake_minimum_required(VERSION <min>[…<max>][FATAL_ERROR])

    设置该工程的cmake最低支持版本,注意"VERSION"不能写成小写,否则会报cmake_minimum_required called with unknown argument “version”.

  • project

    project(<PROJECT-NAME> [LANGUAGES] [<language-name>...])
    project(<PROJECT-NAME>
           [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
           [DESCRIPTION <project-description-string>]
           [HOMEPAGE_URL <url-string>]
           [LANGUAGES <language-name>...])
    

    设置项目名。项目名会保存在PROJECT_NAME变量中。如果调用顶层CMakeLists.txt,项目名也会存在CMAKE_PROJECT_NAME变量中。

    调用project命令后,会默认设置一下变量的值,例如,

    PROJECT_SOURCE_NAME,<PROJECT-NAME>_SOURCE_DIR, 表示项目源码目录绝对路径

    PROJECT_BINARY_NAME,<PROJECT-NAME>_BIANRY_DIR,表示build目录绝对路径

    设置project版本号,注意需要cmake_policy(SET CMP0048 NEW),可以通过如下变量获取版本号信息

    • PROJECT_VERSION, <PROJECT-NAME>_VERSION
    • PROJECT_VERSION_MAJOR, <PROJECT-NAME>_VERSION_MAJOR
    • PROJECT_VERSION_MINOR, <PROJECT-NAME>_VERSION_MINOR
    • PROJECT_VERSION_PATCH, <PROJECT-NAME>_VERSION_PATCH
    • PROJECT_VERSION_TWEAK, <PROJECT-NAME>_VERSION_TWEAK

    CMAKE_PROJECT_VERSION 也可以获取project版本号,但是project命令要在顶层CMakeLists.txt使用。
    LANGUAGES 默认支持c和c++。

  • aux_source_directory

    aux_source_directory(<dir> <variable>)
    

    Find all source files in a directory.Collects the names of all the source files in the specified directory and stores the list in the provided.

    设置源文件名,从<dir>中找源文件名并存储到中。

  • add_executable

    add_executable(<name> [WIN32] [MACOSX_BUNDLE]
                  [EXCLUDE_FROM_ALL]
                  [source1] [source2 ...])
    

    将源文件([source1] [source2 …] )编译成可执行程序,可执行程序的名称由指定。

  • message
    message通常可用于编译脚本的调试、跟踪。

补充:

cmake的命令包含4类: scripting commands,project commands,ctest commands,deprecated commands。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sif_666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值