Cmake基础教程--第1章:初识cmake

news2024/11/15 22:44:05

Cmake基础教程--第1章:初识cmake

  • 何为Cmake
  • Cmake的优缺点
    • 优点
    • 缺点
  • Cmake与makefile之间的关系
  • C/C++ 如何编译为可执行文件
  • 一个最简单的Cmake示例

从本篇文章开始,我会出一系列文章,致力于Cmake工具的学习使用。阅读本文章之前,
作者默认读者会使用基础的命令行工具且具有C++基础。

何为Cmake

首先,Cmake是一个开源的,跨平台的自动化构建工具,它使用一组简单的描述性语言来生成本地构建环境,使用cmake工具,我们可以很好的去管理我们的项目。

对比于其他编程语言的构建工具,Cmake无疑复杂了很多,但这是由于 C++ 古老的编译模型和关注于底层的特性导致的。也正是由于Cmake的出现,才为C++真正提供了可靠的跨平台解决方案

注意

  • Cmake并非是包管理工具
  • Cmake不仅仅支持C++,Cmake实际支持相当多种语言

对于C++程序员来说,学习Cmake几乎是必经之路。

Cmake的优缺点

优点

  1. 跨平台支持: Cmake是真正的跨平台工具,支持大多数主流的操作系统(相比之下makefile就不具备良好的跨平台性)
  2. 与IDE集成度好: Cmake几乎可以用于生成所有主流IDE的项目文件,使得开发者可以使用自己所习惯的开发环境。
  3. 广泛的社区支持: CMake 拥有庞大的用户群和活跃的社区,这意味着有大量的文档、教程和示例可供参考,遇到问题时也容易找到解决方案。

缺点

  1. 学习成本高: Cmake是一门语言,初学者需要花相当大的精力来学习
  2. 更新频繁: Cmake仍旧在发展成长,新版本可能引入不兼容的更改,这要求项目必须持续跟进和适配

Cmake与makefile之间的关系

相信很多人都曾认为过Cmake的功能就是去生成对应的makfile,其实这样的认知是错误的。
Cmake并不一定会生成Makefile,这是由你使用的编译器决定的,只是由于大部分情况是
生成makefile,才给了大家错误的认知。

也由于Cmake构建项目时并不一定会生成makefile,所以不建议cmake搭配make使用。

C/C++ 如何编译为可执行文件

在正式学习Cmake之前,先来了解一下C/C++的基本编译原理。一般来说,可以分为以下四步:

  • 预处理: 进行宏替换,展开内联函数,处理条件编译指令(#if之类),以及将头文件内容插入到当前文件中,经过预处理阶段后,源文件会变为一个没有预处理指令的干净的文件。
  • 编译 读取预处理后的源代码并将其转换为汇编代码或目标代码,在此期间,译器还会进行各种优化,以提高生成代码的效率。
  • 汇编 汇编器将汇编代码转换为机器语言指令的二进制形式,也就是目标代码或对象文件。每个源文件通常会被编译和汇编成单独的对象文件。
  • 链接 链接器解析未定义的符号引用,将它们与定义在其他模块或库中的符号匹配。链接器还会重定位代码和数据,使其在内存中处于正确的地址,同时合并数据段和代码段,生成最终的可执行文件。

一个最简单的Cmake示例

我们在项目目录中编写一个名为main.cpp的源文件,接下来演示如何使用Cmake来构建这个
简单项目。
main.cpp

  1. 编写 CMakeLists.txt 文件
    在工程目录下编写一个名为CMakeLists.txt的文件,这里注意大小写不要拼错。在CMakeLists.txt中编写以下代码:
cmake_minimum_required(VERSION 3.20) #指定最小版本
project(HELLO) #指定项目名
add_executable(test main.cpp) #指定由源文件main.cpp生成可执行文件test

这里注意#为cmake语法中的注释,每行代码的功能已经在代码中指出,使用该cmake可以使用main.cpp来编译出可执行文件test。其中project指定的项目名与生成的可执行文件名称并无关系。

  1. 使用cmake生成makefile或其他文件
    在工程目录使用以下命令来生成makefile或其他的文件(注意这里的环境会生成makefile,但这并不是绝对的,例如在msvc下就不会生成makefile而是其他的文件,后文均以makfile举例)
cmake -B [目录名称]

如下:
cmake -B build
该命令会指定一个文件夹的名称,然后生成这个目录,会将makefile相关的文件放入build目录中,注意,在大部分情况下,我们都不应该修改该目录下的文件内容。
3. 生成项目
使用如下命令来生成项目:

cmake --build [目录名称]

如下:
build
命令的目录应当与上一步生成的目录一致,执行完之后,会在该目录下生成对应的可执行文件。注意,在本例中,你直接在build的目录下使用make命令也能编译得到正确的可执行文件,但这不是我们赞成的行为。

至此,你就完成了一个最简单的Cmake的工程构建。

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

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

相关文章

#MFC 编译错误msvcrt.lib(exe_main.obj) : error LNK2019

如果是CMake,需要改如下: set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:CONSOLE") 改为 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS") 如果是mfc工程文件,需…

【数据结构】五、树:7.哈夫曼树、哈夫曼编码

3.哈夫曼树和哈夫曼编码 文章目录 3.哈夫曼树和哈夫曼编码3.1带权路径长度3.2哈夫曼树的定义和原理3.3哈夫曼树的构造代码实现 3.4特点3.5哈夫曼编码压缩比代码实现 3.6哈夫曼树-C 3.1带权路径长度 #mermaid-svg-yeVKyVnDwvdIc5ML {font-family:"trebuchet ms",verda…

【第18章】Spring Cloud之Gateway配置

文章目录 前言一、示例二、Route Metadata Configuration1. 路由元数据配置2. 获取元数据配置 三、Http timeouts configuration(请求超时配置)1. Global timeouts(全局)2. Per-route timeouts(路由) 四、CORS Configuration(跨域配置)1. Global CORS Configuration(全局)2. Ro…

【HarmonyOS NEXT星河版开发学习】小型测试案例07-弹性布局小练习

个人主页→VON 收录专栏→鸿蒙开发小型案例总结​​​​​ 基础语法部分会发布于github 和 gitee上面(暂未发布) 前言 在鸿蒙(HarmonyOS)开发中,Flex布局是一种非常有用的布局方式,它允许开发者创建灵活且响…

FPGA知识基础之--存储器知识点总结以及基于ip核的简单双端口RAM的实现和仿真(附RTL代码和Testbench代码)

目录 前言一、存储器的分类二、实验任务三 、简单(伪)双端口四、程序设计4.1 模块4.2 时序分析4.3 RTL代码ram_wr 写模块2.ram_rd 写模块3.top模块 五、仿真 前言 笔者在最近的存储器学习时,遇到了一些问题,为此笔者用本篇博客来…

ICM-20948芯片详解(9)

接前一篇文章:ICM-20948芯片详解(8) 六、寄存器详解 2. USER BANK 0寄存器详述 (6)INT_PIN_CFG 参考代码: #define ICM20948_INT_PIN_CFG 0x0F (7)INT_ENABLE 参考代码&#x…

我有10台120kw的直流充电桩,赢利了多少钱?我列出所有成本和多少利润,这里要算上政府补贴。【慧哥开源充电桩平台 HZCOS-chargeOS-cloud】

特别申明:仅仅代表个人观点,错的地方虚心请教学习,各位手下留情 拥有的10台120kW直流充电桩的盈利情况,并考虑到政府补贴,具体数字需要根据实际情况调整。 成本计算 初始投资成本 充电桩成本:每台120kW直…

利用Llama 3 API实现盈利:细节解析

随着人工智能技术的快速发展,基于大模型的服务成为了众多初创企业关注的焦点。Llama 3 API作为一种强大的语言模型接口,为小型公司提供了利用先进AI技术的机会。本文将探讨这些小公司如何通过Llama 3 API实现盈利,并分析其中的关键因素。 一、Llama 3 API性能概览 批处理输…

网络药理学:分子对接之一:macos上MOE和Autodock和PyMol和gromacs的下载、PDB数据库使用、gromacs能量最小化

MOE下载 别想了,要钱的。而且不算是主流软件,过。 Autodock和Autodock tools下载 下载地址:https://autodock.scripps.edu/download-autodock4/ 如果你的电脑满足以下配置,那么推荐下载autodock GPU 操作系统:mac…

重磅!观测云荣获SOC 2 Type II鉴证报告

近日,观测云在数据安全和内控管理领域再获殊荣,成功获得全球四大会计师事务所之一的安永会计师事务所签发的SOC 2 Type II 鉴证报告。这一荣誉不仅是对观测云在相关领域卓越表现的认可,更是对其对客户承诺坚定性和执行力的有力证明。 观测云 …

软件设计之JavaScript(1)

软件设计之JavaScript(1) 【狂神说Java】JavaScript最新教程通俗易懂 学习内容: 软件开发技能点参照:软件开发,小白变大佬,这套学习路线让你少走弯路是认真的,欢迎讨论 软件开发技能点顺序参照:Java学习…

“前缀和”专题篇一

目录 【模版】前缀和 【模版】二维前缀和 寻找数组的中心下标 除自身以外数组的乘积 【模版】前缀和 题目 思路 这道题如果使用暴力解法,即针对每次查询,先算出前r个数的总和,然后再算出前l-1个数的总和,然后相减就得出本次查…

2.类和对象(上)

1. 类的定义 1.1 类定义格式 • class为定义类的关键字,Stack为类的名字,{ }中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; (类和结构体非常像&#…

12-利用Excel创建IC类元件库

1.新建excel文件 2.找到模型向导 3.修改属性

技术速递|.NET Aspire 8.1 中面向云原生开发人员的新增功能!

作者:Mitch Denny 排版:Alan Wang 5 月份,我们向全世界发布了 .NET Aspire 的第一个正式版本。.NET 社区的热烈响应令我们深受鼓舞,在大家首次试用时,我们一直在积极倾听并与开发人员互动。 今天,我们很高…

EF Core连接PostgreSQL数据库

PostgreSQL数据库介绍 PostgreSQL是一个功能强大的开源对象关系型数据库管理系统(RDBMS)。最初于1986年在加州大学伯克利分校的POSTGRES项目中诞生,PostgreSQL以其稳定性、灵活性和扩展性而著称。它支持丰富的数据类型、复杂的查询、事务完整…

C语言进阶(3)

1.数组传参 一维数组传参的时候使用数组名,代表数组首元素的地址;函数接受时形参可以是数组形式,也可能是指针形式,数组形式比较简单数组怎么写,函数接受是就怎么接受,使用指针就要将指针类型写清楚,如下 …

一文搞懂MES、ERP、SCM、WMS、APS、SCADA、PLM、QMS、CRM、EAM及其关系

MES、ERP、SCM、WMS、APS、SCADA、PLM、QMS、CRM、EAM各个系统到底是什么意思?今天一文就给大家分享! 在企业管理中,各种信息系统扮演着至关重要的角色,它们如同企业的神经系统,确保各个部分高效协同运作。 MES&#…

微信小程序项目开发【从0到1~入门篇】

创建第一个小程序 1、小程序简介2、第一个小程序:注册小程序开发账号3、第一个小程序:安装开发者工具3.1 了解微信开发者工具3.2下载安装3.3 扫描登录 4、创建小程序项目5、小程序代码的构成5.1json配置文件5.2WXML模板5.3WXSS样式5.4JS 逻辑交互 6、宿主…

HDMI线连接显示器后色彩灰暗问题解析与解决方案

随着科技的快速发展,HDMI线已成为连接电脑与显示器的重要工具。然而,当HDMI线连接显示器后,有时会遇到显示器色彩灰暗的问题。本文将针对这一问题进行深入解析,并提供相应的解决方案。 一、HDMI线连接显示器后色彩灰暗的原因 1. …