CMake的安装和使用

news2024/11/24 20:37:20

Windows平台

1. 下载CMake和MinGW,并安装。

(1)CMake下载和安装:

下载地址:Download | CMake  可以直接下载如下安装程序进行安装:

 安装时注意,选择将cmake命令加入系统环境变量,如下:

或者装完后手动配置环境变量,将CMake安装路径下的bin目录加入环境变量,如下:

打开终端或cmd测试CMake安装是否成功,如下表示成功:


(2)MinGW下载和安装:

下载地址:MinGW-w64 - for 32 and 64 bit Windows - Browse /mingw-w64 at SourceForge.net

可以直接下载如下安装程序进行安装:

安装时根据自己电脑选择,如我是64位系统:

装完手动配置环境变量,将MinGW安装路径下的bin目录加入环境变量(本人已装完,不知道安装过程中是否有和CMake一样的添加入环境变量的选项,有则无需手动配置):

 打开终端或cmd测试MinGW安装是否成功,如下表示成功:

 


2. CMake的快速上手

本部分先熟悉一下CMake使用的大致流程,第三部分会展开介绍CMake的详细使用。

使用CMake构建简单的Hello world程序:

(1)创建项目文件夹demo,其中包含build和src两个子文件夹:

build文件夹用于存放CMake生成的文件,如CMake会生成GNU编译器的Makefile等文件,或Visual Studio编译器的项目文件,可执行文件等。

src文件夹用于存放源代码和CMakeLists.txt文件。

        CMakeLists.txt文件用于存储cmake生成的构建文件的位置、编译器类型、编译选项等。

(2)在src文件夹下创建hello.cpp,写入Hello world程序。

(3)在src文件夹下创建CMakeLists.txt文件,写入如下内容:

cmake_minimum_required(VERSION 3.10)  # 要求cmake最低版本为3.10

project(hello) # 项目名为hello

add_executable(hello hello.cpp)  # 使用hello.cpp生成可执行文件hello.exe

(4)在项目文件夹下打开终端窗口,构建项目:

命令:cmake CMakeLists.txt的路径  ,如:

cmake ..\src

本人电脑默认使用Visual Studio的MSCV编译器进行构建,如下:

输入CMake --help命令查看所有编译器,找到Generators,前面带星号的是当前使用的编译器:

 若需使用gccg++,则需在构建命令中加上 "MinGW Makefiles" ,如下:

cmake CMakeLists.txt -G "MinGW Makefiles" ..\src\

成功生成:

 之后使用build选项进行编译链接:

 

 此时build目录下生成了可以运行的hello.exe


3. CMake的详细使用

3.1 概念

a)目标文件(target):可执行文件(add_executable)、库文件(add_library);

b)命令(cmake-command):也称为函数;

c)变量(cmake-variable):以CMAKE_开头的变量名;

d)属性(cmake-properties):文件/文件夹都有各自的属性。

补充:

a)cmake命令不区分大小写,但参数、变量区分;

b)参数间使用空格或分号隔开;

c)使用${VAR}引用变量;

d)引号可加可不加,但若字符串中有空格必须加;


3.2 命令

(1)cmake_mininum_required

设置cmake的最低版本。

用法:

cmake_minimum_required(VERSION 版本号)

示例:

cmake_minimum_required(VERSION 3.10)

(2)project

设置项目名、版本号、语言。

用法:

# 用法1:
project(<项目名> [<语言>])
# 若未指定语言,则默认使用C和CXX(即C++)

# 用法2:
project(<项目名> [<VERSION 版本号>] [<LANGUAGES 语言>])

示例:

# 用法1:
project(demo C CXX)
# 项目名:demo,使用语言:C和C++

# 用法2:
project(demo VERSION 1.0 LANGUAGES C CXX)
# 项目名:demo,版本号:1.0,使用语言:C和C++

(3)message

输出信息。

用法:

message([<mode> "..."]
# mode有如下选项:
#    STATUS:前缀加上 --
#    SEND_ERROR:产生错误,跳过生成过程
#    FATAL_ERROR:产生错误,终止运行

项目名会存储在变量PROJECT_NAMECMAKE_PROJECT_NAME中(CMAKE_开头的变量为cmake内置变量);

源文件路径存储在变量PROJECT_SOURCE_DIR中,等价于<PROJECT_NAME>_SOURCE_DIR;

构建文件(即build文件夹)路径存储在变量PROJECT_BINARY_DIR中,等价于<PROJECT_NAME>_BINARY_DIR

项目版本号存储在变量PROJECT_VERSION中,等价于<PROJECT_NAME>_VERSION

项目主版本号存储在变量PROJECT_VERSION_MAJOR中,等价于<PROJECT_NAME>_VERSION_MAJOR

项目次版本号存储在变量PROJECT_VERSION_MINOR中,等价于<PROJECT_NAME>_VERSION_MINOR

示例:使用message命令打印上述部分变量,注意变量需使用${}引用:

build文件夹下打开终端,使用如下cmake命令构建:


(4)add_executable 

用指定的源文件生成可执行文件。

用法:

add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] [source1] [source2...])
# name为生产的可执行文件名(与项目名无关)
# 如Windows系统会生成name.exe

 示例:

add_executable(demo helloworld.cpp)
# 用helloworld.cpp生成demo.exe可执行文件(Windows)


(5)set

将变量设置为指定值。

用法:

set(<variable> <value>)

简单使用示例:

set(A 1)
# 将A设置为1

set(CMAKE_CXX_STANDARD 11)
# 设置C++标准,注:CMAKE_开头的变量为cmake内置变量

设置输出文件位置示例:

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
# 将运行时目标文件(exe、dll、so等)输出位置设置为/build/bin

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
# 将归档文件(lib、a等)输出位置设置为/build/bin

(6)option

定义一个开关。

用法:

option(<variable> "<描述>" [value])
# value的值为ON或OFF,默认为OFF
# 命令行使用cmake命令时,可使用 -D<variable>=ON/OFF 选项来覆盖定义option时的开关状态

会结合下面的configure_file给出使用示例。


(7)configure_file

将输入文件进行替换并生成输出文件。

用法1:

configure_file(<input> <output>)
# input文件中形如@VAR@或${VAR}的字符串会被替换为这些变量的当前值,若未定义则被替换为空字符串。
# 注意:VAR必须在替换命令之前定义。

用法1示例:

input01.h中的 @PROJECT_VERSION@ ${PROJECT_VERSION} 替换为项目版本号,并将替换后的文件输出为output.h

input01.h文件:

 CMakeLists.txt文件中的写法:

使用cmake -G "MinGW Makefiles" ..\src命令构建完后,会在build目录下生成output.h文件,并且已替换成功:

用法2:

#cmakedefine VAR ...

// 上面的命令会根据VAR是否被set,替换为以下以下两行之一

#define VAR ...    // VAR被set
/* #undef VAR */   // VAR未被set

用法2示例:

结合option开关使用,有以下需求:

① 定义开关DATE_ENABLEOFF状态;

② 若开关为ON状态,则设置DATE变量为20230511

③ 若设置了DATE变量,则将input01.h中的#cmakedefine DATE 2023替换为#define DATE 2023,并输出到output.h文件中;

input01.h文件:

开关为的状态,此时输入cmake -G "MinGW Makefiles" ..\src构建,可见output.h中的结果:

在命令中加入-DDATE_ENABLE=ON参数选项将开关设置为,再构建,可见output.h中的结果:


(8)include_directories

指定所有目标的头文件搜索路径。

用法:

include_directories(dir1 [dir2 ...])
# 将目录dir1、dir2添加到INCLUDE_DIRECTORIES属性中,即编译器的头文件搜索路径;
# 编译时,这些添加的路径会是所有目标的头文件搜索路径。

示例:

比如hello.cpp中想要包含build目录下的func.h头文件:

若未在CMakeLists.txt中指定头文件的搜索路径,则编译链接时会出错,如下:

 需要在CMakeLists.txt中让编译器知道头文件的搜索路径在build目录下:

 此时再次编译成功:


(9)target_executable_directories

指定某个目标的头文件搜索路径。

用法:

target_include_directories(<target> <INTERFACE|PUBLIC|PRIVATE> <dir1> [<INTERFACE|PUBLIC|PRIVATE> <dir2>] ... )
# 为target目标文件添加搜索路径dir1、dir2;
# 目标文件有INCLUDE_DIRECTORIES和INTERFACE_INCLUDE_DIRECTORIES两个属性
# INCLUDE_DIRECTORIES为对内头文件目录,INTERFACE_INCLUDE_DIRECTORIES为对外头文件目录。
INCLUDE_DIRECTORIESINTERFACE_INCLUDE_DIRECTORIES
PRIVATE
INTERFACE
PUBLIC

示例:

如指定hello目标文件的头文件搜索路径为build:

即可编译成功。 


3.3 库的生成和链接

(1)add_subdirectory

添加源文件目录。

用法:

add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
# source_dir 源文件目录的位置。
# binary_dir 指定编译生成文件存放的位置。

(2)add_library

用指定的源文件生成库。

用法:

add_library(<name> [STATIC|SHARED|MODULE] [EXCLUDE_FROM_ALL] [<source>...])
# STATIC静态库,SHARED动态库。
# 生成库的名字是lib<name>.so或lib<name>.a

(3)target_link_libraries

链接库。

用法:

target_link_libraries(<target> <PRIVATE|PUBLIC|INTERFACE> <item>)
# target 链接入的目标文件,item可以是一个targe,也可以绝对路径。

示例:

如在src目录下有calc子目录,其中的源码是实现加减运算:

则需在CMakeLists.txt中加入如下,表示将calc目录加入生成、编译过程:

calc目录中也添加CMakeLists.txt文件:

CMakeLists.txt如下,旨在将加法运算源码生成静态库

构建并编译:

生成的静态库文件存放于build/calc目录下:

 

将生成的静态库链接如目标文件,使得目标文件可使用:

 生成、编译成功:

动态库只需将STATIC改为SHARED


 区别:

# 指定搜索头文件的路径
include_directories() # 所有
target_include_directories() #单个

# 链接库
link_libraries()
target_link_libraries()


3.4 文件的安装

将可执行文件、库文件、头文件等安装到指定目录。类似于复制。

用法:

install(TARGETS <target> DESTINATION <dir>)
# 安装目标文件

install(FILES <file> DESTINATION <dir>)
# 安装普通文件

install(PROGRAMS <非目标文件的可执行程序(如脚本)> DESTINATION <dir>) 

install(DIRECTORY <dir> DESTINATION <dir>) 
# 安装目录

示例:

install(TARGET MathFunctions DESTINATION lib) # 安装目标文件
install(FILES MathFunctions.h DESTINATION include) # 安装文件
install(DIRECTORY doc/ DESTINATION d) # 安装目录

 命令行用法:

cmake --install .   # 将当前目录安装到默认目录
cmake --install . --prefix <dir>   # 将当前目录安装到dir目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/514158.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python并发编程: Python速度慢的罪魁祸首,全局解释器锁GIL

python速度慢的两大原因 动态类型语言&#xff0c;边解释边执行 由于GIL&#xff0c;无法利用多核CPU并发执行 GIL是什么&#xff1f; 全局解释锁&#xff08;Global Interpreter Lock&#xff0c;GIL&#xff09;是计算机程序设计语言解释器用于同部线程的一种机制&#xff0c…

c#笔记-异常

异常 当一个程序遇到各种各样的问题而无法正常运行时&#xff0c;我们需要知道导致问题的原因&#xff0c; 并根据原因来解决问题。 一种常见的方式是程序给出一串错误码&#xff0c;然后开发人员查找对应的错误信息。 而在c#中&#xff0c;我们可以在程序内部就处理异常&am…

改进YOLOv8 | 即插即用篇 | 在 C2F 模块中添加 【SE】 【CBAM】【 ECA 】【CA 】注意力机制 | 附详细结构图

这篇教程是在你默认添加了《改进YOLOv8 | 即插即用篇 | 手把手教你 YOLOv8 添加注意力机制 | 适用于【检测任务】【分类任务】【分割任务】【关键点任务】| 20+ 种全打通!》的代码后进行的后续改进的补充。 1. SE 注意力模块 论文名称:《Squeeze-and-Excitation Networks》 …

AI画图 Ubuntu 20.04.5 LTS x86_64 Docker stable diffusion webui 及 http api接口

资源 Docker镜像 docker pull darkroot1234/ayanami:latest 参考地址&#xff1a; docker一键运行stable diffusion webui&#xff0c;常用插件和功能完备&#xff0c;获得镜像后可打包带走 - 哔哩哔哩 nvidia cuda 驱动 ​​​​​​​Linux x64 (AMD64/EM64T) Display D…

numpy中reshape(1,-1) 和 reshape(-1,1) 的理解

我们都知道**reshape()方法**的作用是将数据按照指定的维度重新组织并返回。也就是reshape&#xff08;行&#xff0c;列&#xff09;可以根据指定的数值将数据转换为特定的行数和列数&#xff0c;就是转换。 但我们经常在大佬的代码中&#xff0c;或者报错提示中发现&#xf…

什么是虚拟机?

我们都知道在 Windows 系统上一个软件包装包是 exe 后缀的&#xff0c;而这个软件包在苹果的 Mac OSX 系统上是无法安装的。类似地&#xff0c;Mac OSX 系统上软件安装包则是 dmg 后缀&#xff0c;同样无法在 Windows 系统上安装。 为什么不同系统上的软件无法安装&#xff0c…

常见4种风险定量分析法

常见的风险定量分析方法主要有&#xff1a; 一、 敏感性分析法 用于确定哪些风险对项目影响最大&#xff0c;将其它不确定因素固定在基准值&#xff0c;再考察某个因素的变化会对目标产生多大的影响。 在这一分析中&#xff0c;检查每一个项目成分的不确定性对所检查项目目标的…

提示工程L1:关键原则

提示工程指南&#xff1a;关键原则 一、 环境配置 chatgpt使用有诸多限制&#xff0c;所以采用国产模型来代替&#xff0c;加载开源的chatGLM模型&#xff0c;使用ChatGLM-6b的INT8版本。 chatGLM6b在LLM匿名竞技场中的排名&#xff1a; import os import torch import war…

大学生找工作防坑指南,收藏10000+

2023年就业季即将抵达&#xff0c;你害怕了吗&#xff1f; 据数据统计&#xff0c;今年的应届生人数再创新高&#xff0c;将达到1158万人&#xff0c;相信同学们看到这串数字已经感到毛骨悚然。然而大学生要面临的挑战不仅这些&#xff0c;最残酷的考验还在最后。 作为初出茅庐…

某些科技外企结束在中国市场直接运营,你如何看?

在新的竞争态势下&#xff0c; 向左走&#xff0c;还是向右走…… 【全球存储观察 &#xff5c; 热点关注】前些天&#xff0c;我发了一篇文章《你如何看LinkedIn“领英职场”将于8月9日起停止中国服务&#xff1f;》引发了业内朋友的热议&#xff0c;大家一致认为&#xff0c…

const和int const 理解笔记(图、代码、讲解)

本文参考了 》C 中的 const & &#xff08;常引用&#xff09;参数 - 知乎 因为博文写的很详细&#xff0c;所以博主按着自己的理解写了demo&#xff0c; 和一些方便自己理解的备注。 自学的时候看到了下面这个代码&#xff0c;所以 const&是啥 首先&#xff0c;一句…

C++中继承的语法和使用

C入门必看 继承的定义及概念概念定义 基类和派生类对象赋值转换继承后的作用域派生类默认的6个成员函数该何去何从&#xff1f; 多继承 面向对象语言3大特性&#xff1a;封装、继承、多态。 继承的定义及概念 概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最…

Dubbo接口测试没你想的那么高大上

主题&#xff1a;Dubbo接口测试没你想的那么高大上 一、Dubbo是什么&#xff1f; Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架一款分布式服务框架、高性能和透明化的RPC远程服务调用方案、SOA服务治理方案下图是阿里巴巴技术解决方案演变图&#xff0c;从单应用->…

卡特兰数三个通项公式的推导

前提条件&#xff1a; 有两种操作&#xff0c;一种操作的次数不能超过另外一个&#xff0c;或者是不能有交集这些操作的合法方案数&#xff0c;通常是卡特兰数 情景&#xff1a; 1&#xff09;n个0和n个1构成的字串&#xff0c;所有的前缀子串1的个数不超过0的个数&#xff…

月薪低于5千元必看,省钱购物攻略,本人亲测有效

作为资深的网购用户&#xff0c;我不允许我的姐妹们还不知道&#xff0c;网上购物如何省钱&#xff1f;如果你是学生党&#xff0c;或者月薪低于5千元&#xff0c;一定要看一看&#xff01;学会了不但能提升生活品质&#xff0c;还能帮你省下好多钱~ 同样的东西&#xff0c;我…

云渲染动画价格一般多少?

云渲染是什么&#xff1f; 云渲染就是通过互联网将用户本地需要渲染的文件上传到云端服务器中&#xff0c;再通过云端庞大的计算机集群资源进行运算操作&#xff0c;帮助用户在云端完成渲染工作后&#xff0c;用户再下载到本地的过程&#xff0c;整个过程操作十分简便。 云渲染…

解释一下泛型擦除?为什么java必须强制?

一、概述&#xff1a; 在解释什么是泛型擦除之前我们得先了解什么是Java泛型。所谓的泛型就是参数化的类型。这就意思着我们可以具体的类型作为一个参数传递给方法、类、接口。 为什么我们需要泛型呢&#xff1f;首先我们都知道在java里&#xff0c;Object就是对象的父类。Ob…

2023 年10款「会议管理」软件对比

在这篇文章中&#xff0c;我们将介绍2023年你可以尝试的10个会议管理软件。我们还将介绍会议管理的基础知识&#xff0c;涉及的步骤&#xff0c;以及如何创建会议议程。 2023 年 10 款会议管理软件对比 会议管理软件解决方案是一种数字工具&#xff0c;可以让个人和团队计划、…

一、【Pytorch笔记】pytorch简介,开发环境安装,搭建

一、下载Anaconda Anaconda包括Conda、Python以及一大堆安装好的工具包&#xff08;其他深度学习里用到的东西&#xff09;&#xff0c;比如&#xff1a;numpy、pandas等。所以下了Anaconda就不用下载Python进入Anaconda官网&#xff1a;https://www.anaconda.com/download/下…

【数字 IC】从底层重新认识 D 触发器、建立时间和保持时间

目录 1. NMOS 和 PMOS 2. MOS 管搭建逻辑门 3. 锁存器和触发器 3.1 交叉耦合反相器 3.2 SR 锁存器 3.3 D 锁存器 3.4 D 触发器 4. D 触发器的建立、保持时间 1. NMOS 和 PMOS MOSFET&#xff08;金属氧化物半导体场效应晶体管&#xff09;或 IGFET&#xff08;绝缘栅场…