一篇文章搞懂CMake(gcc、g++、cmake解释)

一篇文章搞懂CMake (gcc、g++、cmake解释)

这里写目录标题

  • 一篇文章搞懂CMake (gcc、g++、cmake解释)
    • gcc
    • g++
    • cmake
      • 1. CMake 流程
      • 如何使用cmake?
        • 简单的CMake.txt文件
    • 参考

gcc

gcc命令来自英文词组“GNU Compiler Collection”的缩写,其功能是用于C/C++语言编译器。原文链接:https://www.linuxcool.com/gcc

GCC 的编译流程包括以下几个阶段:

  • 预处理(Preprocessing):对源代码进行宏替换、头文件展开等操作,生成预处理文件(.i 文件)。
  • 编译(Compilation):将预处理文件转换为汇编代码(.s 文件)。
  • 汇编(Assembly):将汇编代码转换为目标文件(.o 文件)。
  • 链接(Linking):将目标文件与库文件等链接起来,生成可执行文件。

下面是一个简单的示例,以 C 语言为例:

#include <stdio.h>int main() {printf("Hello, world!\n");return 0;
}

我们可以使用以下命令编译:

gcc hello.c -o hello

这个命令将进行以下几个步骤:

  1. 预处理,还是c语言文件,但是对头文件(<stdio.h>)和宏会进行展开
gcc -E hello.c > hello.i # 和 gcc -E hello.c -o hello.i 效果是一样的
  1. 编译,由c文件变成汇编文件
gcc -S hello.i -o hello.s
  1. 汇编,生成目标文件,即二进制文件,但是此时的文件是没有链接的,不可以执行
gcc -c hello.s -o hello.o
  1. 链接,生成可执行文件
gcc hello.o -o hello

运行该文件会输出 “Hello, world!”。

g++

gcc和g++是两个不同的编译器,gcc主要用于编译C语言代码,g++则主要用于编译C++代码

虽然gcc也可以编译C++代码,但是使用g++更为方便。因为g++可以自动链接C++标准库,而gcc需要手动链接C++标准库。此外,g++还能够自动识别C++代码,并调用相应的编译器。

在使用g++编译C++代码时,需要使用“.cpp”作为文件扩展名。如果使用“.c”作为文件扩展名,g++会将代码识别为C语言代码进行编译,而不是C++代码。

参考: https://www.cnblogs.com/lulipro/p/6661763.html

编译流程和 gcc 是一样的,只需要把 gcc 换成 g++ 即可

  • -save-temps 保留编译产生的中间文件,使用这个参数,就没必要将前面的参数 -E -S -c 一个一个地使用了
g++ -save-temps -o hello hello.cpp 
  • 优化器
g++ -O2 hello.cpp -o hello

-O0: 不进行优化,编译速度最快,但是生成的可执行文件执行速度最慢。
-O1: 开启一些简单的优化,会消耗更多的编译时间,但是可以稍微提高可执行文件的执行速度。
-O2: 开启更多的优化,可以提高可执行文件的执行速度,但是编译时间也会更长。
-O3: 开启大部分优化,可以极大地提高可执行文件的执行速度,但是编译时间也会非常长。
-Os: 优化可执行文件的大小,尽可能减小生成的可执行文件的体积。

一般用O2就够了,可以看到下面的这段代码,写的非常不合理,但是经过优化之后效率高了很多

  • -w
    编译时,不显示任何警告消息。

  • -Wall
    编译时,显示所有出现的警告消息。

cmake

CMake是一个跨平台的自动化构建系统,可以根据不同的平台、不同的编译器,生成相应的构建文件(如Makefile或Visual Studio项目文件等),以便进行编译、链接等操作。CMake通过CMakeLists.txt 文件来描述项目的构建过程,用户可以在这个文件中定义源代码、库、头文件、编译选项等信息,从而让CMake自动生成相应的构建文件。

举个例子: 比如说有一个项目需要跨平台,windows 下用 VS 编译,linux 下用 makefiles 或者 xcode 编译。如果这时候需要添加一个 bar.cpp 文件,一般做法就是每个IDE的项目文件中依次添加,但是如果工程太大,这种做法就很麻烦了,因此引入cmake就是为了方便,只需要把 bar.cpp 添加到 CMakeLists.txt 文件中即可。

1. CMake 流程

在 gcc小节 中给出了程序生成可执行文件的流程,但是如果程序很多的时候,这种方式就显得太繁琐了。因此就需要用到 makefile,makefile 是一种能够自动化构建和编译项目的文本文件。简单来说只要存在 makefile文件, make 一下就能完成项目的编译工作。

但是夸平台的话,新的矛盾就会显现出来,makefile 通常依赖于当前的编译平台,而且编写 makefile 的工作量比较大,解决依赖关系时也容易出错。

因此 CMake 能够解决该问题,它能跟据不同的编译平台,自动生成 Makefile 文件,流程如下:

如何使用cmake?

简单的CMake.txt文件

CMake 最基本的步骤是以下三步:

# 最低 CMake 版本要求:指定项目所需的最低 CMake 版本
cmake_minimum_required(VERSION 3.12)# 项目名称:使用 project() 命令设置项目的名称
project(MyProject)# 将源文件添加到项目中
add_executable(myapp main.cpp)

举个例子

创建以下几个文件

add.c

#include <stdio.h>
#include "head.h"int add(int a, int b)
{return a+b;
}

div.c

#include <stdio.h>
#include "head.h"double divide(int a, int b)
{return (double)a/b;
}

head.h

#ifndef _HEAD_H
#define _HEAD_H
// 加法
int add(int a, int b);
// 减法
int subtract(int a, int b);
// 乘法
int multiply(int a, int b);
// 除法
double divide(int a, int b);
#endif

main.c

#include <stdio.h>
#include "head.h"int main()
{int a = 20;int b = 12;printf("a = %d, b = %d\n", a, b);printf("a + b = %d\n", add(a, b));printf("a - b = %d\n", subtract(a, b));printf("a * b = %d\n", multiply(a, b));printf("a / b = %f\n", divide(a, b));return 0;
}

head.h

#include <stdio.h>
#include "head.h"int multiply(int a, int b)
{return a*b;
}

sub.c

#include <stdio.h>
#include "head.h"// 你好
int subtract(int a, int b)
{return a-b;
}

建立相关文件并保存

在同一目录下新建一个 CMakeLists.txt 文件
输入下面内容并保存:

# 最小版本
cmake_minimum_required(VERSION 3.0)
# 工程名
project(Test)
# 将所有相关文件都添加进来,用于编译
add_executable(myapp add.c div.c main.c mult.c sub.c)

文件结构如下:

我们在当前文件下执行下面的操作:

1.建立一个文件夹,因为cmake之后会生成很多文件

mkdir bulid

2.进入到新建文件夹中

cd bulid

3.执行 cmake 生成 Makefile

cmake ..

cmake指令需要在和 CMakeLists.txt 文件同一个目录下执行,因此需要…

cmake之后我们发现在build文件夹下多了 Makefile 以及其他文件

4.执行 make 指令生成可执行文件

make

5.执行文件,测试是否编译成功

至此一个简单的 cmake 编译过程就结束了。

参考

[1] https://subingwen.cn/cmake/CMake-primer/?highlight=cmake

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

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

相关文章

如何关闭计算机软件更新功能,如何关闭电脑自动更新功能

大家好&#xff0c;我是时间财富网智能客服时间君&#xff0c;上述问题将由我为大家进行解答。 以Windows 7电脑为例&#xff0c;关闭电脑自动更新功能的方法&#xff1a; 1、首先按下winr打开运行窗口。 2、接着输入services.msc并点击回车。 3、然后选择Windows update选项。…

关闭windows自动更新

1、win r ---- 输入services.msc进入服务 找到Windows Update 双击打开属性弹框 将启动类型改为禁用&#xff0c;并在恢复中将第一次失败改成无操作 2、win r ---- 输入gpedit.msc进入本地组策略编辑器 找到计算机配置 》管理模板 》Windows组件 》Windows更新&#xff0c;选…

linux7怎么关闭更新,如何让centos7关闭yum自动更新系统

客户指定机器的系统要centos 7.6,易秋网络老易这边提供的实际也是centos 7.6,但是等客户安装完毕宝塔后,系统显示是centos 7.7,但是客户因为某些原因,就是要centos 7.6,易秋网络老易猜测是安装宝塔的过程中,centos 7.6自动更新到centos 7.7了。 [root@1403-sxx yum]# ca…

计算机配置更新怎么关闭,如何关闭戴尔电脑自动更新系统配置

如何关闭戴尔电脑自动更新系统配置 有时候我们不想更新系统的配置&#xff0c;但是操作系统会为我们自动更新系统配置。那么如何关闭戴尔电脑自动更新系统配置呢?下面就让jy135小编来告诉大家吧&#xff0c;欢迎阅读。 1、开机之后&#xff0c;等待系统启动&#xff0c;启动完…

第4章:SpringMVC的域对象共享数据

1、使用ServletAPI向request域对象共享数据 ①控制器 Controller public class HelloController {RequestMapping("/test")public String index(HttpServletRequest request){request.setAttribute("test","test666");return "index"…

如何彻底关闭Win10自动更新,Win10永久关闭自动更新的方法

如何彻底关闭Win10自动更新&#xff1f;Win10自动更新的问题是很多用户都遇到的问题&#xff0c;很多时候我们关闭了自动更新&#xff0c;过一段时间系统又自动更新了&#xff0c;由于win10自动更新非常顽固&#xff0c;所以我们要从多个地方下手才能永久关闭其自动更新&#x…

服务器自动更新不能关闭,Windows2008服务器如何关闭系统自动更新?

前几天因为系统自动更新&#xff0c;总是会在Windows2008服务器C盘自动生成一些缓存文件&#xff0c;这些文件占用了大量的C盘空间&#xff0c;直接影响了C盘的正常运行。这里不多讲直接把他们删除就可以。 下面继续讲&#xff0c;闫工告诉您Windows2008服务器如何关闭系统自动…

linux自动升级关闭,Ubuntu关闭内核自动更新

环境&#xff1a; Ubuntu 20.04 TLS 1、查看当前已有内核 dpkg --list|grep linux-image dpkg --list|grep linux-headers 2、查看当前使用的内核版本 uname -r 3、卸载内核命令**(如果不想卸载内核不要执行这些命令)** sudo apt purge linux-image-xxx# xxx表示上图中后面的数…

约瑟夫环(递归+迭代)

剑指 Offer 62. 圆圈中最后剩下的数字 leetcode 这题让我对递归和迭代又有了新的一层认识&#xff0c;首先一定要把图画对&#xff0c;就是模拟约瑟夫的这个过程 红色是被淘汰的位置&#xff0c;绿色的3是最后会活下来的人的位置 0 ~ n 正好是数组中的下标 重点在于计算 不同…

自制wpf年会抽奖小软件

今年公司年会&#xff0c;领导要我做一个小的抽奖软件&#xff0c;给了一组号码&#xff0c;要求每次抽奖抽的众多号码中的一个随机数&#xff0c;并且抽奖之后该号码不会参与下次抽奖。 前端代码&#xff1a; <Window x:Class"WpfApp1.MainWindow"xmlns"h…

年会抽奖项目免费分享即开即用

最近好多公司都在搞年会&#xff0c;年会肯定离不开抽奖环节&#xff0c;而抽奖就有可能会存在内幕哦。 今天给大家分享一款免费的抽奖软件&#xff0c;公平公正无套路无黑幕&#xff0c;快推荐给你身边的小伙伴吧。 一、抽奖配置 默认只有一等奖&#xff0c;可增加二等奖三…

抽奖活动软件 html,APP怎么制作抽奖活动,制作APP抽奖活动有何亮点

来源|活动盒子-APP活动运营工具(huodonghezi.com) 谈到APP抽奖活动运营&#xff0c;我们就不得不说起APP运营抽奖的老司机们&#xff0c;通过自己的调查&#xff0c;思考&#xff0c;策划&#xff0c;制作&#xff0c;最终呈现出一个优秀的APP抽奖活动。当然抽奖活动的APP运营分…

抽奖活动软件 html,webAPP最常用的活动促销案例:大转盘H5抽奖特效

今天25学堂跟大家分享一个移动H5开发当中,最常用的一个H5效果。那就是幸运大转盘抽奖特效。 当然,网上有很多类似的大转盘H5抽奖源码的分享和设计效果图展示。 25学堂分享的目的是告诉大家如何去修改先有的H5特效源码为我们的H5项目所用。 H5项目的名称是:幸运大转盘抽奖 使…

python抽奖程序_抽奖程序python

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 大家好,我开始学python,想做一个抽奖程序,源代码如下,如果我要在框架内加上1等奖1个人 ,2等奖2个人,三等奖3个人 应该怎么样编写相关联的代码,就是点击1等…

简易抽奖软件逻辑实现

又到年终了&#xff0c;各种抽奖软件需求纷至沓来&#xff0c;现分享一个简易抽奖软件逻辑&#xff0c;希望对大家抽奖类的需求有所帮助&#xff1b; 直奔主题吧&#xff0c;测试程序很稳定&#xff0c;可以直接将界面修改为其他形式 1、奖池枚举类 public enum AwardGrade{Sp…

518抽奖软件——极简设计、极致体验

518抽奖软件——极简设计、极致体验 名称&#xff1a;518抽奖软件 版本&#xff1a;3.1 大小&#xff1a;14520KB 语言&#xff1a;简体中文 授权&#xff1a;试用版 插件&#xff1a;无 分类&#xff1a;应用-办公工具 图标&#xff1a;http://www.518cj.net/images/80.png 截…

随机抽奖软件

点击 &#xff1a;源码及软件下载 开发语言&#xff1a;C# 使用&#xff1a;winForm 、Timer类 主界面&#xff1a;(可全屏) 可配置项&#xff1a; 1、是否移除中奖者 2、是否全屏 3、替换背景图片 4、字大小&#xff08;数字越大字越大&#xff09; 5、字颜色&#xff0c;默认…

J辉摇号摇奖抽奖软件

功能&#xff1a; 可选择重复/不重复中奖&#xff1b; 支持从TXT或Exlce中导入抽奖人员&#xff1b; 支持中奖名单显示 、保存&#xff1b; 支持抽取结果页面或字幕显示&#xff1b; 做个简单的使用说明。默认是读取根目录的name.json文件的数据的。 创建自己的数据点击左…

【抽奖软件】C++,duilib实现完整抽奖软件系统(有源码)

最近帮朋友做了一个晚会抽奖软件系统&#xff0c;在这里和大家分享一下&#xff0c;有需要的可以参考&#xff0c;时间紧&#xff0c;本人水平有限&#xff0c;有些地方处理的还不是太理想&#xff0c;欢迎大家指出来。 1&#xff0c;设计思路 朋友单位要举办个晚会&#xff…

滚动照片抽奖软件

CODE GitHub 源码 1、女友说很丑的一个软件 说个最近的事情&#xff0c;女友公司过年了要搞活动&#xff0c;需要个抽奖的环节&#xff0c;当时就问我能不能给做一个&#xff0c;正好我也没啥事儿&#xff0c;就在周末的时候用C#做了一个&#xff0c;虽然派上用场了&#xf…