CMake良心教程(1)手把手教你入门!

目录

一.CMake是什么?有什么用?

二.环境配置

2.1CMake安装

 2.2MinWG安装

三.构建最小项目

3.1项目的构建

3.2外部构建与内部构建

四.CMakeLists.txt语法介绍

4.1 project关键字

4.2 set 与 PROJECT_NAME

4.3 MESSAGE关键字

4.4 ADD_EXECUTABLE关键字

五.语法的基本原则

六.语法注意事项


一.CMake是什么?有什么用?

如果想要真正的了解一个人,那我们第一眼看到的肯定是人的轮廓。知识也是同理,所以我会先介绍CMake的大体轮廓。

想要了解CMake是干什么的,我们首先要知道一个源文件的编译过程。

  • 1.用编辑器编写源代码,如.c文件。
  • 2.用编译器编译代码生成目标文件,如.o。
  • 3.用链接器连接目标代码生成可执行文件,如.exe。

但如果源文件太多,一个一个编译那得多麻烦啊?于是人们想到,为啥不设计一种类似批处理的程序,来批处理编译源文件呢?

于是就有了make工具,它是一个自动化编译工具,你可以使用一条命令实现完全编译。但是你需要编写一个规则文件,make依据它来批处理编译,这个文件就是makefile,所以编写makefile文件也是一个程序员所必备的技能。

对于一个大工程,编写makefile实在是件复杂的事,于是人们又想,为什么不设计一个工具,读入所有源文件之后,自动生成makefile呢,于是就出现了cmake工具,它能够输出各种各样的makefile或者project文件,从而帮助程序员减轻负担。但是随之而来也就是编写cmakelist文件,它是cmake所依据的规则。

综上我们现在可以把CMake看作是用于产生Makefiles文件的工具。

二.环境配置

我的环境是 Windows10 + CMake + MinGW,MinGW 就是 GCC 的 Windows 移植版本。所以本文就以我的环境来进行讲解。

2.1CMake安装

安装链接:CMake官网安装

根据个人需求选择适当的版本进行下载,其中包含许多不同版本。

【重要提示】请确认你的计算机操作系统类型,以及是32位还是64位。(附注:x86表示32位系统;x64表示64位系统)

下载完成后,双击进行安装。 

下载完成后,单击“Next”按钮,在下图中勾选“I accept the terms in the License
Agreement”复选框接受许可协议:

选中“Add CMake to the system PATH for all users”单选按钮添加系统路径变量。也可以同时勾选“CreateCMakeDesktopIcon”复选框,以便在安装完成后在桌面上创建CMake的快捷方式图标。

点击Install进行安装。

安装完成后,进入Windows系统环境变量设置对话框,如下图所示。可以看到,由于刚才的设置CMake已经自动将其安装路径“D:\Program Files\CMake\bin” 写入环境变量Path中。

 重启电脑后,打开cmd黑窗,输入cmake,能够显示cmake的一些信息即为安装成功,如下图:

 2.2MinWG安装

下载地址:MinWG官网下载

点击上面链接,进入下图1后将页面往下滑到图2区域,点击所需离线包名称:

(Version: 指的是 gcc 的版本,如果没有特殊的需求,一般选择最高的版本号即可。最高版本是8.1.0 ,选中它即可

选默认

Architechture:电脑系统是 64位的,选择 x86_64;如果是 32位 系统,则选择 i686

选x86_64

Threads:如果是 Windows ,选择 win32 ,如果是 Linux、Unix、Mac OS 等其他操作系统要选择 posix

选win32

Exception:seh 是新发明的,而 sjlj 则是古老的。seh 性能比较好,但不支持 32位。 sjlj 稳定性好,支持 32位。

建议64位操作系统选择seh

选seh)

,然后就会弹出图3所示对话框,保存下载即可。离线包大约50MB(解压后500MB左右),下载一般只需半个小时,具体视乎网速情况而定。

 

 下载完成解压后的界面是这样的

 环境变量配置:

设置->搜索高级系统设置->环境变量->path->新建,将MinGW-w64包目录下bin文件夹的全路径粘贴到后面,bin的后面有无斜杠均可,如下图:

 

 

 

 至此环境就安装完毕。

三.构建最小项目

3.1项目的构建

最基本的项目是将一个源代码文件生成可执行文件。对于这么简单的项目,只需要一个三行的 CMakeLists.txt 文件即可,这是本篇教程的起点。在Test目录中创建一个 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.15)project(test)add_executable(Test test.c)

  1. cmake_minimum_required(VERSION 3.15): 这一行指定了编译这个项目所需的CMake的最低版本。在这个例子中,这个项目需要3.15或者更高版本的CMake。

  2. project(test): 这一行定义了项目的名字,这里的项目名字是“test”。CMake将会创建一些变量,比如test_SOURCE_DIRtest_BINARY_DIR,以便在项目内部使用。

  3. add_executable(Test test.c): 这一行告诉CMake创建一个叫做“Test”的可执行文件,源文件是test.c。CMake将自动找到正确的编译器(在这种情况下,是C编译器)来编译test.c,然后链接生成名为“Test”的可执行文件。

注意,此示例在 CMakeLists.txt 文件中使用小写命令。CMake 支持大写、小写和混合大小写命令。

test.c文件在 Test 目录中 :

#include<stdio.h>
int main(){
printf("hello dxm");
return 0;
}

现在就可以构建和运行我们的项目了,就是先运行 cmake 命令来构建项目,然后使用你选择的编译工具进行编译。

先从命令行进入到Test目录,并创建一个构建目录 build,接下来,进入 build 目录并运行 CMake 来配置项目,并生成构建系统:

依次解释:

1. cd C:\Users\86137\Desktop\Test 目的是切换到Test目录下

2.mkdir build 创建一个构建目录 build

3.cd build 进入 build 目录

4.cmake -G "MinGW Makefiles" ..  这个命令的意思是在当前目录生成一个用于MinGW的Makefile,它会根据位于上级目录的源代码来设置Makefile的内容。然后你就可以使用MinGW的make命令来编译你的项目了。

5.cmake --build . --build 指定编译生成的文件存放目录,其中就包括可执行文件,. 表示存放到当前目录。

6.Test.exe 可以看到执行出了正确结果

此时目录结构为:

Test/build/CMakeLists.txttest.cpp

3.2外部构建与内部构建

这里创建了一个 build 目录存放编译产物,可以避免编译产物与代码文件混在一起,这种叫做外部构建。

还有一种内部构建,即直接在项目根目录下进行构建系统与编译,这时构建和编译命令就更改为:

cmake -G"MinGW Makefiles" .
cmake --build .

内部构建会使得项目文件很混乱,一般直接用外部构建即可。 到这里我们的第一个CMake项目就完成了。

四.CMakeLists.txt语法介绍

4.1 project关键字

  • 用来设置项目的名字和支持的语言,默认支持所有语言
project(demo)
project(demo CXX) 

第二行代表指定工程名为demo,支持语言是C++ 

最好写上,它会引入两个变量 demo_BINARY_DIR 和 demo_SOURCE_DIR,同时,cmake 自动定义了两个等价的变量 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR。

4.2 set 与 PROJECT_NAME

这是上文的CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.15)project(test)add_executable(Test test.c)

指定了项目名后,后面可能会有多个地方用到这个项目名,如果更改了这个名字,就要改多个地方,比较麻烦,那么可以使用 PROJECT_NAME 来表示项目名。

add_executable(${PROJECT_NAME} test.cpp)

生成可执行文件需要指定相关的源文件,如果有多个,那么就用空格隔开,比如:

add_executable(${PROJECT_NAME} a.cpp b.cpp c.cpp)

我们也可以用一个变量来表示这多个源文件:

set(SRC_LIST a.cpp b.cpp c.cpp)
add_executable(${PROJECT_NAME} ${SRC_LIST})

 set 命令指定 SRC_LIST 变量来表示多个源文件,用 ${var_name} 获取变量的值。

  • 设置变量

1.set 直接设置变量的值

set(SRC_LIST main.cpp test.cpp)
add_executable(demo ${SRC_LIST})

2. set 追加设置变量的值

set(SRC_LIST main.cpp)
set(SRC_LIST ${SRC_LIST} test.cpp)
add_executable(demo ${SRC_LIST})

于是原来的 CMakeLists.txt 文件就可以变成如下所示:

cmake_minimum_required(VERSION 3.15)project(Test)SET(SRC_LIST test.cpp)add_executable(${PROJECT_NAME} ${SRC_LIST})

这样看起来就很简洁。

4.3 MESSAGE关键字

message关键字用于向用户显示一些消息。这可能是一些调试信息、警告或者错误信息。基本的使用格式如下:

message([<mode>] "message text" ...)

其中<mode>用于指定消息的类型,可以是以下几种:

  • (none): 等同于 STATUS,这是默认选项,消息会打印到 stderr。
  • STATUS: 普通信息,打印出一些状态消息,例如提示用户某个操作正在进行。该消息会被 CMake GUI 和 ctest -S 脚本捕获。
  • WARNING: 警告信息,但不会停止处理。
  • AUTHOR_WARNING: 类似于 WARNING,但可以通过设置 CMAKE_SUPPRESS_DEVELOPER_WARNINGS 变量来抑制,以避免对最终用户的干扰。
  • SEND_ERROR: 类似于 ERROR,但处理过程会继续进行。它会在 CMake 运行过程中立即显示错误消息,并将错误标记在生成过程中。
  • FATAL_ERROR: 严重错误信息,遇到此类信息将会停止所有的 CMake 运行过程。

以下是几个 message 的示例:

message(STATUS "This is a status message. It is used for providing information.")
message(WARNING "This is a warning message. It can be used to convey important information.")
message(FATAL_ERROR "This is a fatal error. It will stop the processing of CMake.")

这些信息可以在你运行 cmake 命令时在命令行中看到,帮助你了解你的配置文件的状态或者是出现的错误。

4.4 ADD_EXECUTABLE关键字

在CMake中,ADD_EXECUTABLE是一个关键指令,它被用来从指定的源代码文件创建一个可执行文件。

ADD_EXECUTABLE的基本语法如下:

ADD_EXECUTABLE(executable_name source1 source2 ... sourceN)

在这个语法中:

  • executable_name是你希望创建的可执行文件的名称。这个名字不包含任何后缀,例如“.exe”。CMake会根据目标系统自动添加适当的后缀。
  • source1, source2, ..., sourceN是你希望包含在可执行文件中的源代码文件。这些文件可以是C,C++或者其他CMake支持的编程语言的源代码文件。

例如,如果你有一个C++项目,其中包含两个源文件main.cppfunctions.cpp,并且你想将这个项目编译成名为myProgram的可执行文件,那么你可以使用以下的CMake指令:

ADD_EXECUTABLE(myProgram main.cpp functions.cpp)

请注意,ADD_EXECUTABLE只会创建可执行文件的构建规则,但并不会真正执行编译。实际的编译过程会在你运行make或者与你的构建系统相对应的命令时进行。

五.语法的基本原则

  • 变量使用${}方式取值,但是在IF控制语句中是直接使用变量名
  • 指令(参数1 参数2...)参数使用括弧括起,参数之间用空格或分号分开。
  • 指令是大小写无关的,参数和变量是大小写有关的。但推荐全部使用大写。

六.语法注意事项

  • SET(SRC_LIST main.cpp) 可以写成SET(SRC_LIST "main.cpp") ,如果源文件名字中含有空格,就必须要加双引号。
  • ADD_EXECUTABLE(hello main)后缀可以不写,他会自动去找.c和.cpp,最好不要这么写,容易产生误导。 

注:本节先到这里,下一节进入实操,让你的代码看起来更像一个工程。 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安全防护,保障企业图文档安全的有效方法

随着企业现在数据量的不断增加和数据泄露事件的频发&#xff0c;图文档的安全性成为了企业必须高度关注的问题。传统的纸质文件存储方式已不适应现代企业的需求&#xff0c;而在线图文档管理成为了更加安全可靠的数字化解决方案。那么在在线图文档管理中&#xff0c;如何采取有…

【流量、日志分析】常见的web流量分析、windows日志分析

1.web流量分析 1.1 特点 通常会提供一个包含流量数据的 PCAP 文件&#xff0c;有时候也会需要先进行修复或重构传输文件后&#xff0c;再进行分析。 复杂的地方在于数据包里充满着大量无关的流量信息&#xff0c;因此如何分类和过滤数据是我们需要做的。 1.2 流量包修复 例…

计算机视觉与图形学-神经渲染专题-pi-GAN and CIPS-3D

《pi-GAN: Periodic Implicit Generative Adversarial Networks for 3D-Aware Image Synthesis》 摘要 我们见证了3D感知图像合成的快速进展&#xff0c;利用了生成视觉模型和神经渲染的最新进展。然而&#xff0c;现有的方法在两方面存在不足&#xff1a;首先&#xff0c;它们…

18. SpringBoot 如何在 POM 中引入本地 JAR 包

❤️ 个人主页&#xff1a;水滴技术 &#x1f338; 订阅专栏&#xff1a;成功解决 BUG 合集 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; Spring Boot 是一种基于 Spring 框架的轻量级应用程序开发框架&#xff0c;它提供了快速开发应用程…

06 为什么需要多线程;多线程的优缺点;程序 进程 线程之间的关系;进程和线程之间的区别

为什么需要多线程 CPU、内存、IO之间的性能差异巨大多核心CPU的发展线程的本质是增加一个可以执行代码工人 多线程的优点 多个执行流&#xff0c;并行执行。&#xff08;多个工人&#xff0c;干不一样的活&#xff09; 多线程的缺点 上下文切换慢&#xff0c;切换上下文典型值…

Android LinearLayout dynamic add child ImageView,Glide load,kotlin

Android LinearLayout dynamic add child ImageView&#xff0c;Glide load&#xff0c;kotlin images.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"andro…

宋浩概率论笔记(二)随机变量

本章节内容较多&#xff0c;是概率论与数理统计中最为重要的章节&#xff0c;对于概率密度和分布函数的理解与计算要牢牢掌握&#xff0c;才能在后期的学习中更得心应手。

前端js--剪刀石头布

效果图 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><linkrel"stylesheet"href"ht…

libcurl网络库的函数接口使用

文章目录 1、libcurl简介2、libcurl的使用3、函数简介4、 curl_easy_setopt函数部分选项介绍5、curl_easy_perform 函数说明&#xff08;error 状态码&#xff09;6、简单实例,包含库文件&#xff0c;头文件即可 1、libcurl简介 libcurl是一个跨平台的网络协议库&#xff0c;支…

Running Homebrew as root is extremely dangerous and no longer supported

Running Homebrew as root is extremely dangerous and no longer supported 查看磁盘所有信息 在使用homebrew安装smartmontools&#xff0c;查看Mac磁盘信息&#xff0c;包括mac磁盘写入量、mac磁盘健康、磁盘启动次数等&#xff0c;遇到的问题及解决方案 使用brew install s…

【IDEA + Spark 3.4.1 + sbt 1.9.3 + Spark MLlib 构建鸢尾花决策树分类预测模型】

决策树进行鸢尾花分类的案例 背景说明&#xff1a; 通过IDEA Spark 3.4.1 sbt 1.9.3 Spark MLlib 构建鸢尾花决策树分类预测模型&#xff0c;这是一个分类模型案例&#xff0c;通过该案例&#xff0c;可以快速了解Spark MLlib分类预测模型的使用方法。 依赖 ThisBuild /…

Django的FBV和CBV

Django的FBV和CBV 基于django开发项目时&#xff0c;对于视图可以使用 FBV 和 CBV 两种模式编写。 FBV&#xff0c;function base views&#xff0c;其实就是编写函数来处理业务请求。 from django.contrib import admin from django.urls import path from app01 import view…

xcode打包导出ipa

转载&#xff1a;xcode打包导出ipa 目录 转载&#xff1a;xcode打包导出ipa 第一步&#xff1a;注册苹果开发者账号 第二步&#xff1a;下载APP Uploader 第三步&#xff1a;使用xcode打包导出ipa文件&#xff0c;供其他人内测 众所周知&#xff0c;在开发苹果应用时需要使…

通达信上涨回调选股公式,趋势指标和摆动指标结合使用

在前面的文章中&#xff0c;介绍了赫尔均线 (HMA)和随机RSI(StochRSI)&#xff0c;这两个指标分别属于趋势指标和摆动指标。趋势指标和摆动指标是技术分析中常用的两类指标&#xff0c;用于分析市场的走势和波动&#xff0c;它们的计算方法、应用场景都是有区别的。今天利用两类…

PowerDesigner数据库设计工具使用笔记

简单记录下这个数据库设计工具的使用&#xff0c;在开发中设计数据库过程用得上&#xff0c;好记性不如烂笔头Q 显示窗口 PowerDesigner的工具箱原来叫palette&#xff0c;现在叫Toolbox&#xff0c;大概是PowerDesigner 16版本更名的 工具类View >ToolBox 即可 选择数据…

学术资源加速

以下为可以加速访问的学术资源地址&#xff1a; github.comgithubusercontent.comgithubassets.comhuggingface.co 编辑 /etc/network_turbo vim /etc/network_turbo 内容格式参考如下&#xff1a; export no_proxylocalhost,127.0.0.1 export http_proxyhttp://127.0.0.…

pom文件---maven

027-Maven 命令行-实验四-生成 Web 工程-执行生成_ev_哔哩哔哩_bilibili 27节.后续补充 一.maven下载安装及配置 1)maven下载 2) settings文件配置本地仓库 3)settings配置远程仓库地址 4)配置maven工程的基础JDK版本 5)确认JDK环境变量配置没问题,配置maven的环境变量 验证…

GD32F103VE外部中断

GD32F103VE外部中断线线0~15&#xff0c;对应外部IO口的输入中断。它有7个中断向量&#xff0c;外部中断线0 ~ 4分别对应EXTI0_IRQn ~ EXTI4_IRQn中断向量&#xff1b;外部中断线 5 ~ 9 共用一个 EXTI9_5_IRQn中断向量&#xff1b;外部中断线10~15 共用一个 EXTI15_10_IRQn中断…

5 小时玩转阿里云 Flink 实时湖仓,速速报名!

阿里云 Flink 专家与传智教育高级顾问联合出品&#xff0c;5 小时玩转阿里云 Flink 实时湖仓&#xff0c;项目依托于传智教育博学谷线上教育平台数字化建设场景&#xff0c;真实还原实时计算业务细节&#xff0c;学完后掌握基于阿里云的 Flink CDC&#xff0c;Paimon&#xff0…

前台自动化测试:基于敏捷测试驱动开发(TDD)的自动化测试原理

一、自动化测试概述 自动化测试主要应用到查询结果的自动化比较&#xff0c;把借助自动化把相同的数据库数据的相同查询条件查询到的结果同理想的数据进行自动化比较或者同已经保障的数据进行不同版本的自动化比较&#xff0c;减轻人为的重复验证测试。多用户并发操作需要自动…