Linux环境开发工具之gcc/g++

前言

我们前面介绍了yum和vim,可以在Linux上安装和卸载软件了也可以在vim上写C/C++代码了!但代码写完后如何编译呢?这就是我们今天来介绍gcc和g++!

本期内容介绍

gcc和g++

程序的翻译过程

动静态库的链接

一、gcc和g++

1.1什么是gcc和g++

gcc和g++是编译器,用于将源代码编译生成可执行程序。

gcc是C语言的编译器,支持C语言编译。

g++是C++编译器,支持C语言和C++的编译。

同类型的还有clang等。

1.2gcc和g++的使用

我在test.c的文件里写了一个代码:

我现在可以用gcc/g++来编译一下(如果没有gcc或g++的话,直接用yum安装一个)

sudo yum install gcc //安装gcc
sudo yum install gcc-c++ //安装g++

gcc/g++  fileneame

gcc test.c
g++ test.c

此时就会生成一个可执行程序,名字默认a.out。我们可以./a.out运行

g++编译同理:

注意:gcc只能编译C语言,而g++既可以编译C++也可以编译C语言!

补充:C语言的文件后缀只能是.c ,而C++的可以是 .cpp/.cc/.cxx

如果你不想编译好的可执行程序默认的a.out,可以带-o选项进行指定生成的可执行文件的名字!

gcc/g++ 文件名 -o 目标文件名

gcc/g++ -o 目标文件名 文件名

gcc/g++ filename -o obj_filename
gcc/g++ -o obj_filename filename

1.3新语法编译不过的问题

可能你的gcc或g++的版本较低(可以使用g++gcc -v查看版本),你的代码中使用了一些新的语法特性。从而导致编译不过的问题!此时需要指定更高的标准去编译了!

我们只需要在编译时带: -std=xxx    (xxx代表是哪个标准)

例如:-std=c98 / -std=c++11

例如使用c99来编译test.c

二、程序的翻译过程

我们在C语言的时候介绍过,代码变成可执行程序是要经过四步的!分别是:预处理、编译、汇编、链接!这里再来大概回顾并了解一下一些过程的使用场景!!

我们以gcc编译tmp.c为例(g++同理),先创建一个tmp.c并写入内容:

预处理

主要任务: 宏替换、去注释、头文件的展开、条件编译

gcc -E filename -o tmp.i

-E是让gcc从filename开始翻译程序到预处理完成停下(i结尾的是预处理后的文件)

我们可以对tmp.c预处理后让他停下来!

我们可以看看,是不是干了宏替换、去注释、头文件的展开这几步:

明显的看到了tmp.i的行数比tmp.c的多了,近多了800行这就说明头文件展开了,我们发现注释也没了,定义的宏直接替换了!!!而且预处理后还是C代码(是更干净的C语言代码)

OK,没问题,但上面也说了还有个条件编译,这是个啥呢?其实在C语言的时候就见过就是#ifdef这个东西,这里主要是介绍一下它的应用场景(当注释用除外)!例如,vs/idea等是不是有什么社区版和专业版之分!他们的功能是不一样的,专业版的会更丰富!那是不是在写编译器的时候还得写两份源代码?维护的时候是不是也得维护两份呢?显然不是的!一般在一份源代码上添加一些条件编译就可以把功能裁剪开!例如:

 1 #include <stdio.h>
  2 
  3 #define v1 1
  4 
  5 int main()
  6 {
  7 #ifdef v1 //体验版                                                                                                                                      
  8     printf("功能1\n");        
  9                               
 10 #elif v2 //社区版             
 11     printf("功能1\n");        
 12     printf("功能2\n");        
 13     printf("功能3\n");        
 14                               
 15 #else    //专业版             
 16     printf("功能1\n");         
 17     printf("功能2\n");         
 18     printf("功能3\n");         
 19     printf("功能4\n");         
 20     printf("功能5\n");         
 21                                
 22 #endif                         
 23                                
 24     return 0;                  
 25 } 

不同的版本在进行对其编译时只需要控制宏定义即可!

当然你也可以不定义宏,在编译时带选项(-D)进行对条件的变量定义进行控制结果:

gcc/g++ -Dv=1 filename -o obj_name

同理不定义就是专业版的可执行程序:

这里有个问题是为什么在编译时还能对代码定义宏呢?原因其实很简单!因为编译器可以裁剪我们的代码!!!上面也看见了,预处理会把注释等去掉,这就充分的说明编译器是可以动我们的代码的,既然你可以动我的代码,那在你编译时让你帮我定义一个宏是不是合情合理呀~!

编译

主要任务:将C语言变成汇编(语法分析那些不在介绍)

gcc -S tmp.i -o tmp.s

-S是让gcc从tmp.i开始对程序进行编译,编译完成就停下来(s是编译后生成汇编的文件)

这里你也可以从tmp.c开始,先预处理在编译。但没必要前面已经有预处理的tmp.i了

我们对tmp.i进行编译,让他生成.s文件:

打开可以看看是否已经是汇编了:

汇编

主要任务:将汇编语言编译成为二进制的目标文件(Linux是.o文件,win是.obj文件)

gcc -c tmp.s -o tmp.o

-o是让gcc从tmp.s开始对程序进行翻译,汇编完成停止

这里也可以从tmp.c开始,和上面同理!

打开tmp可以看看,我们应该看不懂~!

链接

主要任务:形成可执行程序

gcc tmp.o -o my.exe 

OK,这就是一个程序的翻译过程!

三、动静态库的链接

刚刚我们介绍了一个程序的翻译过程,预处理、编译、汇编都可以直观的理解,但链接部分链接的是啥?OK,我们来详谈一下链接到底是做什么的~!

3.1什么是链接?

链接是我们的代码和库结合的过程!

什么是库?

库是一组已经被编译好的程序和数据, 可以被程序使用。一般包含:函数、对象等!

库的分类

库分为静态库和动态库!

静态库:在编译阶段被整体拷贝到可执行程序中的库,在运行时不依赖外部文件!

动态库:在运行时才会被加载的库,在编译时程序只保存了库的地址,运行时才会加载动态库文件!

在Linux下,静态库是以.so结尾的, 动态库是以.a结尾的

在windows下,静态库是以.lib结尾的,动态库是以.dll结尾

OK,我们可以看看我们的程序调用了那些库:

ldd you.exe //ldd + 你的可执行程序

这三个就是我们当前程序所依赖的库!中间的libc.so.6是C语言的库!我们可以看看

其中去掉lib和后缀剩下的就是标准库的名字!也就是c标准库!

可是我的系统中也没有什么安装什么库呀?他怎么会有了?

是的你是没有直接安装,但是你在安装你的编译器的时候会给你安装上,不然安装在安装什么?比如你的VS2019在安装时,是会让你选择例如C/C++桌面开发,游戏开发等。他就是让你选择对应所需的库!但是安装完了之后,我怎么知道他库里面有什么方法?这就是头文件的意义~!

3.2为什么要有链接?

1、提高考法效率

2、让开发站在巨人的肩膀上

比如你今天写了一道算法题,其中涉及到了输入输出。如果没有提前写好的这些库函数,你自己就得手搓~!!!我们以前在C语言的时候刷题没有容器什么都得手搓....已经够够的了!你现在连输入输出都没了,一道算法题想了半天会写了,半小时把核心写好了,结果没有输入输出,手搓写了两星期.....这好像效率太低了吧,而且你也不确定你的是否有bug?所以基于此,有一批全球顶级的程序员把常用的方法等实现了经过长期的检验中稳定性等都很好,所以把这些方法等打包成库并配置了相关的头文件!方便开发,提高了开发效率!

3.3如何进行动静态链接的?

动态链接:

在程序执行到库中方法的时候跳转到动态库执行,执行完了回来继续指向当前的程序!

特点:共享动态库,但是一点动态库缺失,所有的动态链接这个库的程序都无法执行!

静态链接:

在程序执行时不再跳到库里去,直接在当前的程序中查找调用的方法即可!

特点:在编译期间把所有库中的方法全部拷贝到当前的可执行程序中,不在关心库!

OK,我用一个栗子来解释一下,动静态链接的过程:

你现在在初三,你是你们学校的第一名,你马上要上市里去读高中了,但是你又比较喜欢上网,这个学校又不让带手机和电脑。但是你家隔壁就是刚刚毕业的学长,你在中考被这所学校录取后,你问这个学长说学校附近有没网吧。你的学长告诉你,学校东门出去向北100米有个小蚂蚁网吧,那里有个9号机,很好!于是在你开学后,周五晚上你想着明天周六,先把衣服一洗,鞋子一刷,明天中午就干了,后天早上起来把物理一写,数学卷子完成就差不多中午了,我去食堂吃个饭再去网吧打一会CF下午三点多了回来再把英语一写就好了!于是周末吃完饭后你就去上网了很潇洒!后来你发现你的舍友同学都在,。有一天因为抢位子你的某个同学没抢到,一气质之下,把这个网吧给举报了,派出所把网吧给查封了!你们都不能去上网了,一学期就这样结束了!你回家之后你爹说儿子这学期咋样,你给你爹把成绩单一给,发现除了化学错了一个选择题丢了两分外其他都是满分,你爹一看高兴坏了,问儿子你有没有什么要的?你给你爹说,我现在需要一台电脑,上次没有全科满分就是因为一个知识点老师没讲所以我才化学没满分,要是我有电脑我早就查了,肯定就满分了!你爹一听没问题就给校长说一下,就给你去网吧把9号机买了下来装在了你的宿舍,你的舍友看了之后,不久也把8号机装在了宿舍,久而久之你们都人手一台了,外面的网吧封了和你已经没关系了,我可以在宿舍自己上网了!

你的学长就是编译器,你的一天的规划就是程序,上网吧就是依赖动态库,网吧没了所有的人上不了网就是动态库一旦缺失所有依赖这个库的程序都无法运行!

你爹把电脑搬到宿舍,就相当于把库拷贝到了程序,即使外面的网吧再出事情也和你上网没关系了,这就是静态库不依赖其他文件!

我们一般的编译器是默认只提供动态库的!gcc默认形成的可执行程序、默认是动态链接!

动态库 && 动态链接的优缺点:

优点:节约资源

缺点:不可丢失

静态库 && 静态链接的优缺点:

优点:一旦形成和库无关

缺点:浪费资源

OK,我们举个例子验证一下:

当前只有这一个可执行程序,我们可以看看,他现在依赖的可和文件类型:

我们可以清楚地看到他是动态链接!!!我们可以把这个tmp.c文件编译成静态库的可执行:

只需在以前的基础上加 -static即可!

gcc tmp.c -o my_static.exe -static -std=c99

显然这个静态的大小更大,直接是动态库的80倍!!!这里也看出了他们的差别!

这也和我们上面介绍的一致,当把库静态链接拷贝到本地后就不在依赖其他库文件了!

注意:一般是没有静态链库的,我这里是安装了静态库所以才只可以执行上面的指令的!如果你没安装请先试用yum安装!

sudo yum install -y glibc-static libstdc++-static
//glibc-static   C语言的静态库
//libstdc++-static  C++的静态库

OK,好兄弟本期分享到这里就结束了,我们下期再见!

结束语:与其抱怨黑暗,不如提灯前行!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mysql-->highgo迁移

1、迁移工具免安装,解压双击迁移工具&#xff0c;会进入如下界面&#xff1a;migration.rar 2、新建组–>创建新的服务 3、在创建好的服务下,新建数据库连接,建立源表和目标表 4、这一步是获取源库&#xff08;Mysql数据库&#xff09;与目标库&#xff08;瀚高数据库&…

Web开发基本流程

Web是全球广域网&#xff0c;能够通过浏览器访问的网站。我们要访问网站&#xff0c;首先要在浏览器输入对应的域名。 浏览器也是一个程序&#xff0c;京东的网站也是一个程序&#xff0c;在京东那边电脑运行着&#xff0c;我们只是通过浏览器远程访问。京东的程序由三个部分组…

Thread类中start方法和run方法的源码简单解读,联系和区别

我们可以打开idea,按住ctrl将光标移至所查方法上,单击右键,即可查看这两个方法的源码: 1. start方法源码 我们从上至下分析一下: 这个threadStatus是一个int型的变量来表示线程是否开始,0为没有开始,非0为开始,因此当threadStatus不为0时,会抛出非法开始线程的异常. group对象…

VMware扩容硬盘

最近研究Oracle的备份导入导出功能&#xff0c;但是因为磁盘容量不够导致表空间的扩容没办法&#xff0c;从而没办法导入数据库的dmp文件。得想办法先扩容磁盘容量。话不多说上截图操作。 操作环境&#xff1a;VMware10 , Centos 6.9 VMware扩容硬盘步骤 一、关闭虚拟机&…

爬虫(Web Crawler)介绍与应用

## 摘要 本文将介绍什么是爬虫&#xff08;Web Crawler&#xff09;以及其在信息抓取、数据分析等领域的应用。我们将深入探讨爬虫的工作原理、设计特点以及开发过程中需要考虑的关键问题。 ## 一、什么是爬虫 爬虫是一种自动化程序或脚本&#xff0c;用于从互联网上抓取信息…

C++中的凸包:convexHull使用手册【c++重要方法】

最近工作中&#xff0c;用到了凸包&#xff0c;查了一些资料&#xff0c;差不多搞明白了&#xff0c;在这里做一个总结&#xff0c;希望可以帮助到你&#xff01; 什么时候需要它&#xff1f; 如果你想要把一群散落的点&#xff0c;包裹起来。而且希望这个包裹尽可能地紧凑&a…

【c++】类和对象(四)深入了解拷贝构造函数

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好啊&#xff0c;本篇内容带大家深入了解拷贝构造函数 目录 1.拷贝构造函数1.1传值调用的无限调用1.2浅拷贝1.3深拷贝1.4深拷贝的实现 1.拷贝构造函数 拷贝构造函数是一种特殊的…

Linux/Pandora

Pandora Enumeration nmap 第一次扫描发现系统对外开放了22和80端口&#xff0c;端口详细信息如下 访问80端口&#xff0c;显示PLAY是Panda.htb的扩展&#xff0c;将网络监控解决方案带到家门口 尝试添加Panda.htb到/etc/hosts中&#xff0c;访问得到的页面却是一样的&#x…

工具推荐-eNSP(Enterprise Network Simulation Platform)

一.简介 1.1 一款由华为提供的免费的、可扩展的、图形化操作的网络仿真工具平台。 1.2 主要对企业网络路由器、交换机进行软件仿真&#xff0c;完美呈现真实设备实景&#xff0c;支持大型网络模拟。 1.3 让广大用户有机会在没有真实设备的情况下能够模拟,进行模拟网络架构和建…

Mamba复现与代码解读

文章目录 环境配置demo推理源码解析参数解读Mamba块&#xff08;Mamba Block&#xff09;状态空间模型(SSM)选择性扫描算法&#xff08;selective_scan&#xff09;前向传播&#xff08;forward&#xff09; 均方根归一化 &#xff08;RMSNorm&#xff09;残差块&#xff08;Re…

批量删除 rabbitmq中随机队列

批量删除 amq.gen–* 随机队列 操作错误产生了无效随机队列&#xff0c;需要批量删除 过滤列出指定amq.gen–队列 # 列出 指定 vhost/qq 以amq.gen开头的所有队列 rabbitmqctl list_queues --vhost / | grep ^amq.gen-# 批量删除队列 #由于list_queues会列出队列名称以及对应…

Windows系统部署瀚高数据库

1.安装包解压之后&#xff0c;执行setup.exe hgdb-enterprise-6.0.4.rar 2.勾选“我接受协议”&#xff0c;点击下一步&#xff0c;设置数据库安装目录&#xff08;注意安装路径&#xff0c;不要包含中文&#xff0c;也尽量不要包含特殊符号。这里默认会是“6.0.4”&#xff0…

MOV压敏电阻的微观结构与制造工艺

EAK 压敏电阻 应用于电力系统的MOV目前主要有两大系列&#xff0c;它们都是以ZnO为主要成分再加人少量其他金属氧化物添加剂而构成的。添加剂为Bi,O:、Sb,O:、MnO₂和CoO,等构成的 MOV称为Bi系列:添加剂为Pr,0、Co,0、Mg0而不含B,0,或含量极少的MOV称为Pr系列(或称稀土系列)。添…

GIS与Python机器学习:开创地质灾害风险评价新纪元

地质灾害是指全球地壳自然地质演化过程中&#xff0c;由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下&#xff0c;地质灾害在世界范围内频繁发生。我国除滑坡灾害外&#xff0c;还包括崩塌、泥石流、地面沉…

基于springboot+vue实现的基于B2C模式的电子商务平台

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

【免费教程】创建元宇宙3D纪念馆、发布云祭扫3D模型的免费教程

免注册步骤如下&#xff1a; 1、下载html浏览器纯净版&#xff08;推荐电脑打开&#xff0c;网址&#xff1a;https://gitee.com/dtnsman/dtns/raw/master/release/dtns.connector-html.dist-2024-3-27-web.zip 2、切换至&#xff1a;dev00mansfast&#xff08;或qw&#xff…

【前端】Layui的表格常用功能,表单提交事件,表格下拉按钮点击事件,表格外的按钮点击事件

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《前端》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握…

QT作业day5

实现闹钟 头文件&#xff1a; #define ALARM_CLOCK_H#include <QWidget> #include <QTime> #include <QTimerEvent> #include <QTimer> #include <QtTextToSpeech> //文本转语音类 #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { c…

怎么制作iOS证书

首先我们登录appuploder官网 搜索 appuploder 第一个就是我们官网啦&#xff0c;网址是&#xff1a;Appuploader home -- A tool improve ios develop efficiency such as submit ipa to appstore and manage ios certificate 可以跨平台开发&#xff0c;无论是Windows还是Ma…

【计算机操作系统】深入探究CPU,PCB和进程工作原理

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…