Cmake学习之cmake入门

CMake构建流程

CMake主要阶段包括配置、生成、编译(可以用CMake也可以不用)、以及附加的测试、打包

在这里插入图片描述

创建CMake工程

CMakeLists.txt 定义了构建什么、如何构建、运行哪些测试以及创建哪些包

CMakeLists.txt及子目录中的CMakeLists.txt共同构成了一颗构建树,根目录中的CMakeLists.txt逐级调用子目录中的CMakeLists.txt来完成整个项目的构建

源目录及构建目录

源目录即源码目录或CMake工程所在的目录

构建目录即build目录,构建输出的工程及可执行文件最终生成的目录

源目录一个,构建目录可以多个

常见的CMake工程结构
-BASE_DIR
|
---source
|
-----CMakeLists.txt
|
-----...source files
|
---build
|
-----CMakeLists.txt
|
-----...build output files
CMake常用命令
mkdir build
cd build
cmake -G "Unix makefiles" ../source
cmake --build . --config Release --target MyApp
# -G参数表示生成器的类型
# --build 选项指向CMake项目生成的构建目录
# --config选项指定要构建哪个配置
# --target选项可以用来告诉构建工具要构建什么目标
最简单的CMakeLists.txt
cmake_minimum_required(VERSION 3.2) # 指定Cmake使用的最低版本
project(MyApp)  # 工程名
add_executable(MyExe main.cpp)  # 创建可执行文件。一组源文件创建一个可执行文件,多个源文件之间以空格或换行分隔
编译一个库文件并链接
add_library(message
	STATIC
	Message.hpp
	Message.cpp
	)  # 创建一个静态库
# add_library()可以选择编译成静态库(STATIC)、动态库(SHARED)或模块(MODULE),模块在Windows平台上
# 的表现形式为无lib文件的dll
add_executable(hello-world hello-world.cpp) #创建可执行文件
target_link_libraries(hello-world message)  #链接库到可执行文件
# target_link_libraries()表示将库文件链接到目标,目标既可以是可执行文件,也可以是其它库文件
基本变量设置
set(foo ab) # foo=”ab”  使用set定义一个基本变量
set(bar ${foo}cd) # bar = “abcd”  变量的值通过${变量名}获得
unset(myVar)    使用unset可以删除一个变量
环境变量设置

环境变量通过set ENV{变量名}设置
环境变量通过$ENV{varName}来获取

Set(ENV{PATH} “$ENV{PATH}:/opt/myDir”)
缓存变量

缓存变量存储在名为CMakeCache.txt的特殊文件中,并且在CMake运行期间持久存在,直到显式地将它们从缓存中删除

使用CACHE关键字表示设置一个缓存变量

set(varName value... CACHE type “docstring” [FORCE])

缓存变量比普通变量附带更多的信息,包括类型和文档字符串。类型和文档字符串都不会影响CMake如何处理变量,只会让GUI工具以更合适的形式将变量呈现给用户。

通过-D选项定义缓存变量的值

Cmake –D myVar:type=someValue ...  

运行该命令后将替换掉原有的缓存变量,并保存在CMakeCache.txt文件中,后续每次运行cmake都能获取到该变量的值,直到再次替换变量或者删除变量

使用-U选项中删除变量

子目录

add_subdirectory()允许项目将另一个目录引入到构建中。该目录必须有CMakeLists.txt文件,调用add_subdirectory()处理时,在项目的构建中会为其创建相应的目录。

添加的目录不必是源代工程的子目录(不过通常都是),可以添加任何目录,可以指定为绝对路径或相对路径,相对路径相对于当前源目录。通常只在添加主源之外的目录时才需要绝对目录。

作用域说明

add_subdirectory()会为子目录中的CMakeLists.txt文件创建一个新的子作用域调用作用域中定义的所有变量对子作用域是可见的,并且子作用域可以像其他变量一样读取它们的值。

子作用域中创建的任何新变量对调用作用域都是不可见。

对子作用域内变量的任何更改都是该子作用域的局部更改。即使该变量存在于子作用域中。

添加子目录内容

另一种添加子目录中内容的方法是include(),需要手动传入文件名,而add_sudirectory()读入一个目录,并查找CMakeLists.txt文件。

include()没有引入新的变量范围(作用域),而add_subdirectory()引入了新的变量范围

include()处理文件时,CMAKE_CURRENT_SOURCE_DIRCMAKE_CURRENT_BINARY_DIR的值不会改变,但是CMAKE_CURRENT_LIST_DIRCMAKE_CURRENT_LIST_FILE会改变

include()还可以用于加载已命名的模块

一些常见的目录

CMAKE_SOURCE_DIR:源的最顶层目录(即最顶层CMakeLists.txt文件所在的位置)。这个变量永远不会变

CMAKE_BINARY_DIR:构建的最顶层目录。这个变量永远不会变

CMAKE_CURRENT_SOURCE_DIR:当前处理的CMakeLists.txt文件的目录。通过add_subdirectory()处理新文件时更新

CMAKE_CURRENT_BINARY_DIR:当前处理的CMakeLists.txt文件对应的构建目录。每次调用add_subdirectory()处理新文件时更新

CMAKE_CURRENT_LSIT_DIR:类似于CMAKE_CURRENT_SOURCE_DIR,但会在处理包含的文件时更新。需要当前文件的目录时可以使用该变量,总表示为绝对路径

CMAKE_CURRENT_LIST_FILE:提供当前文件的名称,保存文件的绝对路径

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值