Linux下Centos7中的gcc/g++

命为志存。 —— 朱熹


Linux中C/C++翻译过程

  • 1、样例介绍
    • 1、1、gcc版本过低不能编译成功
    • 1、2、编写 .cxx或.cc或.cpp代码(都是C++)
  • 2、程序的翻译过程
    • 2、1、条件编译(补充)
    • 2、2、语言历史
  • 3、深入理解链接
    • 3、1、静态链接的使用场景

1、样例介绍

1、1、gcc版本过低不能编译成功

int main()
{for(int i=0;i<10;i++){printf("%d\n",i);}return 0;
}

可能对于没有配置过的centos来说,会无法编译成功。为什么呢?那是由于gcc的版本在默认的情况之下是取了一个适中的版本,不算太新,正好又不能编译for循环,所以导致这样不能进行编译。
如果想要编译的话,可以根据提示信息,进行改写一下gcc命令

gcc test.c -std=c99

这样的话就能够编写成功了。

gcc test.c -o my.exe -std=c99:确定版本的同时,指定生成可执行文件的名称为my.exe(能够自行定义)。

1、2、编写 .cxx或.cc或.cpp代码(都是C++)

当我们写文件的时候不能够把文件名的后缀弄错这个原因之前讲过如果忘记的话,可以回头看看。
同时编写C++代码的时候不能够写gcc test.c,这样的话会报错,大概率都是链接错误,gcc不认识g++中的流。但是g++能够编译 .c 代码

g++ test.c:默认版本同时默认生成文件名称
g++ test.c -o my.exe -std=c++11:选择编译版本同时命名可执行文件名称。

2、程序的翻译过程

程序翻译过程简单概括: 预处理,编译,汇编,链接

翻译过程gcc命令说明
预处理gcc -E test.c -o test.i宏替换,去注释,头文件展开,条件编译
编译gcc -S test.i -o test.s将C变成汇编语言
汇编gcc -c test.s -o test.o汇编语言编译成为二进制目标文件
链接gcc test.o -o my.exe形成可执行程序

2、1、条件编译(补充)

其中-E表示从现在开始执行程序的翻译,预处理完成就停下。并且我们在写的时候需要尽量的把它保存在一个文件之中,如果不保存的话,会直接显示在显示器上,不方便查看修改等操作。包含头文件展开操作,直接在系统中找到对应的头文件然后进行展开,此时展开了之后头文件就失效了。包括宏替换,去注释。
条件编译: 为了方便不同版本的维护,简化调试成本和修复时间,即使是不同版本的,例如社区版或者是正式版,都是相同的一份代码,可是这么造成每个人使用的软件有区别呢?区别就在于条件编译。
条件编译能够实现对于代码的动态裁剪。

#ifdef X
#elif XX
#else
#endif

可以在软件维护上在条件编译的条件下,完成对于代码的裁剪,从而实现一份代码完成不同的功能。

gcc test.c -D(内容V1=1) test.c :命令行式的宏,更方便的实现代码的裁剪,实现功能的不同保留

!!!!预处理过程的时候头文件展开时候里面的注释没了,源文件中的注释也没有了,那说明什么?说明去注释也可能和条件编译有关!!!

2、2、语言历史

在时代的最开始的时候使用的是打孔纸袋,进行二进制的编写,编写完之后,有光的地方是1,没透光的地方是0。但是由于这样的操作太过于繁琐并且难以检查。所以人们发明了汇编语言,方便我们进行检查和编写。汇编中的符号叫做助记符(方便人们记忆)。但是呢有了汇编语言还是不行,后来就有了VB,VC语言,随着不断的发展又有新的语言,同时还在不断的发展特性,注释啊,宏啊等等一系列操作。
所以在这个过程之中编译器不是一开始就有的,二进制代码是不需要编译器的,从汇编开始以后才开始有编译器。所以随后发展的C语言来说,会站在前人的肩膀上,把C语言翻译成为汇编语言,再通过转化为二进制编程。这样能够减少很多的操作,减少没必要的麻烦。
那么在最开始的时候是先有汇编的编译器还是有汇编的呢?
其实是先有语言,但是语言编译好了也要等能够处理这个语言的汇编器出现。汇编的编译器是用二进制来编写汇编的编译器,然后编写的汇编语言,让汇编经过汇编器转化为二进制。
编译器是软件吗? 是软件。
那么之前用二进制写的汇编编译器就可以在此基础之上用汇编语言来写,利用二进制的汇编编译器,实现汇编语言写的编译器也能够正常运行并且还能简单化。这样的话从此以后也就只需要维护汇编语言写的编译器就能够直接实现运行了。—编译器的自举过程
链接?作用是什么? 链接就是把我们的程序和库结合的过程。通过和库的结合,能够简化编程过程,增加稳定性安全性。
所以在安装开发环境的时候,还会相对应的安装它的标准库。
Linux中C/C++的库位libc-2.17.so

3、深入理解链接

Linux中的库分为两种,动态库以及静态库。
动态库文件后缀:.so
静态库文件后缀:.a

Windows中也有动态库和静态库。
动态库文件后缀:.dll
静态库文件后缀:.lib

链接时,两种连接方式:动态链接,静态链接。

讲个例子来帮助理解。
你是一个高中生,学校是封闭式管理,不允许带手机电脑等一系列电子设备,但是你又特别喜欢上网玩。你很苦恼,为了能够有解决办法,你在正式上学前,找了个认识的高三学长,询问他上网的方法。学长说,虽然学校没有,但是你只要出了校门会有很多很多的网吧,去那里上网就行了,告诉你怎么去网吧的同时还告诉了你网吧的8好位置又靠窗又有空调。随着时间的推移,你越来越熟悉操作流程,不需要过多询问,你就能够处理好时间的安排并且开心的上着网吧。
所以可以总结一下,你去网吧的这个整个事件就能够简单叙述一下链接的过程。
学长就是编译器,学校就是内存,网吧就是目标库的地址。在你没有上学校之前,编译器就已经告诉了你目标库的地址在哪。编译器告诉目标库的地址称为动态链接。网吧就是动态库。编译器告诉你的8号位置就是在动态库中的方法。那你在学校管理时间安排计划表为了上网的过程,就是程序在执行过程中,执行代码(计划表),当执行过程中跳转到库(网吧)并且执行库中的方法(8号位置)之后再返回需要执行的代码。这个过程就是执行一次动态运行的过程。
所以你这么执行的时候,你的同学也会学你,这么去网吧爽一爽。可是林子大了什么都有,就会有一些人要告诉老师,顺便还要举报这个网吧让高中生上网。同时学校附近还有一个派出所,正好直接出动,到网吧之后,让网吧老板出来,问他有营业执照吗?网吧老板说:“啊?”,随后警察说,我接到匿名举报,说你们这有黑网吧,我们现在要依法处置。警察说完之后,老板说:“我保证配合你们调查”。随后网吧就被查封了。后来网吧老板打算“东山再起”,在开一个网吧,但是在开一个就不能开在原本的位置了,要是还在原本的位置,说不定好会有不少的麻烦事。所以倒霉的还有学校内的同学们,想像以前一样上网也就没有机会了。
这说明动态链接非常依赖这个网吧,网吧一旦被查封,所有的同学都将运行不了。这样的行为叫做,共享动态库,但是一旦动态库确实,所有的动态链接这个库的程序都无法执行了。如果此后还有学弟学妹问学长,学长会说上什么网,网吧都没有了。这样换而言之,以后的情况编译都有可能是一个问题。
但是不能上网的条件让你痛不欲生。虽然痛不欲生,你还是努力学习考到了年级第一。你在第一个寒假回家的时候,你的父亲询问了你的成绩。很震惊,你居然考的那么好,你的父亲决定实现你的一个愿望。正好学校网吧被封,你就和父亲说,我就想上网(主要是想查学习资料)。恰好你爸和校长又有关系,你爸就和校长打了个电话,校长说行啊,我给宿管打个招呼,让你在宿舍装一个。有趣的是,你的父亲找到了当时网吧的店长,找到店长之后询问了儿子最喜欢的位置上的机器,你爸当场就买了。之后开学的时候,你爸就把这个机器装到你的宿舍,虽然可能不是新的,但是有总比没有好。
把电脑放在学校宿舍里面的这个过程就是把库拷贝到自己的可执行程序中,这个过程也叫做静态链接。网吧老板也成为了买电脑的。从此往后去网吧的人越来越少。
在编译的时候,把库中的方法拷贝到自己的可执行程序中叫做静态链接。卖电脑的网吧老板也成为了静态库。
gcc默认生成的可执行文件利用的是动态库。

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

  1. 不能够丢失
  2. 在内存中加载的时候只需要加载一份—节省资源

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

  1. 一旦形成和库无关
  2. 浪费资源

怎么验证

gcc -o test-static test.c -static:链接静态链接
ldd test-static:查询链接属性

可是如果没有操作过的操作系统的话通常来说可能没有静态库,找不到静态库的存在。这样看来的话,系统是建议使用动态库。
在这里插入图片描述
/usr/bin/ld :链接加载器不能够找到 -lc。
那么现在就是安装静态库的操作

sudo yum install -y glibc-static libstdc++-static:安装C/C++静态库

3、1、静态链接的使用场景

如果想要自己的程序想要拥有非常强的平台适用的强大性。就必须要让程序自己安装静态库,这样的话,无论在什么地方,无论别人的系统中有没有你需要的库,你都能够通过静态链接实现自己程序的运行。

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

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

相关文章

前端自动化测试(一):揭秘自动化测试秘诀

目录 [TOC](目录)前言自动化测试 VS 手动测试测试分类何为单元测试单元测试的优缺点优点缺点 测试案例测试代码 测试函数的封装实现 expect 方法实现 test 函数结语 正文开始 &#xff0c; 如果觉得文章对您有帮助&#xff0c;请帮我三连订阅&#xff0c;谢谢&#x1f496;&…

android(安卓)最简单明了解释版本控制之MinSdkVersion、CompileSdkVersion、TargetSdkVersion

1、先明白几个概念 &#xff08;1&#xff09;平台版本&#xff08;Android SDK版本号&#xff09; 平台版本也就是我们平时说的安卓8、安卓9、安卓10 &#xff08;2&#xff09;API级别&#xff08;API Level&#xff09; Android 平台提供的框架 API 被称作“API 级别” …

Android APK混淆处理方案分析

这里写目录标题 一、前言1.1 相关工具二、Apk 分析2.1 apk 解压文件2.2 apk 签名信息2.3 apk AndroidManifest.xml2.4 apk code三、Apk 处理3.1 添加垃圾文件3.2 AndroidManifest.xml 处理3.3 dex 混淆处理3.4 zipalign对齐3.5 apk 重新签名3.6 apk 安装测试四、总结一、前言 提…

Unity打包设置

1.Resolution and Presentation (分辨率和显示) Fullscreen Window (全屏窗口): 应用程序将以全屏窗口模式运行&#xff0c;但不会独占屏幕。适用于想要全屏显示但仍需访问其他窗口的情况。 Resizable Window (可调整大小的窗口): 允许用户调整应用程序窗口的大小。适用于窗口…

Selenium相对定位

测试网站&#xff1a;Web form 相对定位的方法&#xff1a; above()&#xff1a;定位基准元素上方的元素below()&#xff1a;定位基准元素下方的元素to_left_of()&#xff1a;定位基准元素左侧的元素to_right_of()&#xff1a;定位基准元素右侧的元素near() &#xff1a;定位基…

糊涂工具包和commons包(Java)

工具包&#xff08;Commons-io&#xff09; 介绍&#xff1a; Commons是apache开源基金组织提供的工具包&#xff0c;里面有很多帮助我们提高开发效率的API 比如&#xff1a; StringUtils 字符串工具类 NumberUtils 数字工具类 ArrayUtils 数组工具类 RandomUtils…

集群自组网应急指挥体系应用技术分析

一、技术背景与意义 随着社会的快速发展和科技的日益进步&#xff0c;面对自然灾害、突发事件等紧急情况&#xff0c;快速有效的应急指挥体系成为维护社会稳定和人民生命财产安全的重要保障。集群自组网应急指挥体系&#xff0c;以其快速部署、高可靠性、强抗毁性等优势&#…

高速传输新体验:探索最新USB-C移动硬盘盒的无限可能

在数字化时代&#xff0c;数据存储的重要性不言而喻&#xff0c;而硬盘盒作为连接外部硬盘与计算机的关键设备&#xff0c;其功能也在不断进化。近年来&#xff0c;随着技术的创新与发展&#xff0c;市场上出现了一种新型硬盘盒——它不仅能安全、高效地存储和传输数据&#xf…

JAVA笔记十七

十七、File-IO流 1.I/O的概念和java.io包 (1)输入&#xff1a;外部源—>程序 输出&#xff1a;程序—>输出目标 外部源、输出目标&#xff1a;磁盘文件、网络连接、内存缓存等 (2)java程序通过流执行I/O 流是一种抽象&#xff0c;可以用来产生信息或者使用信息&#…

Python基础——第一个Python程序

Python基础——第一个Python程序 一、编写和运行代码的工具1.1 为什么需要工具1.2 默认的交互式环境1.3 文本编辑神器 - Visual Studio Code1.4 专业的集成开发环境 - PyCharm 二、编写第一个Python程序2.1 在PyCharm中编写“Hello, World!”程序2.2 运行“Hello, World!”程序…

期指期货做空什么意思?股指期货做空怎么操作?

“期指做空”是一种金融交易策略&#xff0c;主要涉及股指期货。在这种策略中&#xff0c;投资者并没有实际持有股票&#xff0c;而是通过期货合约来进行交易。具体来说&#xff0c;做空是指在期货市场中&#xff0c;投资者预期某项资产的价格将下跌&#xff0c;因此选择先卖出…

springboot农村扶贫管理系统-计算机毕业设计源码34072

目录 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.1.1技术可行性 2.1.2经济可行性 2.1.3社会可行性 2.1.4法律可行性 2.2 系统流程分析 2.2.1 数据流程 2.2.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 …

十日Python项目——第三日(用户中心——邮箱验证、修改密码)

#前言&#xff1a; 在最近十天我会用Python做一个购物类项目&#xff0c;会用到DjangoMysqlRedisVue等。 今天是第三天&#xff0c;主要负责撰写用户中心部分&#xff0c;以及优化登录部分。若是有不懂大家可以先阅读我的前两篇博客以能够顺承。博客&#xff1a;十日Python项…

【你也能从零基础学会网站开发】 SQL结构化查询语言应用基础-- SQL Server 2000创建表约束之IDENTITY唯一游标、DEFAULT约束详解!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 IDENTITY唯一游…

安装CUDA Cudnn Pytorch(GPU版本)步骤

一.先看自己的电脑NVIDIA 支持CUDA版本是多少&#xff1f; 1.打开NVIDIA控制面板 2.点击帮助---系统信息--组件 我的支持CUDA11.6 二.再看支持Pytorch的CUDA版本 三.打开CUDA官网 下载CUDA 11.6 下载好后&#xff0c;安装 选择 自定义 然后安装位置 &#xff08;先去F盘…

怎么远程查看电脑文件?

为什么需要远程访问电脑&#xff1f; 您是否曾遇到需要远程查看电脑文件的情况&#xff1f;例如&#xff0c;由于紧急原因需要访问办公室的电脑文件。那么&#xff0c;我们怎么才能在家里或者在外面远程查看公司电脑上的文件呢&#xff1f; 如今&#xff0c;许多远程控制软件…

用Manim实现Graf的数学动画——【DiGraph】的用法和实际操作

用Manim实现Graf的数学动画——【DiGraph】的详细 这是表示有向图的类。在有向图中&#xff0c;边有方向&#xff0c;意味着边是从一个顶点指向另一个顶点的。 图【Graph】两层含义&#xff1a; 1.称为顶点的连接点图。 2. 绘制的值&#xff0c;通常显示为具有水平轴和垂直轴的…

昇思25天学习打卡营第2天|基础知识-张量

目录 张量 张量Tensor的介绍 创建张量 张量的属性 张量索引 张量运算 Tensor与NumPy转换 Tensor转换为NumPy NumPy转换为Tensor 稀疏张量 CSRTensor COOTensor 张量 张量Tensor的介绍 张量&#xff08;Tensor&#xff09;是一个可用来表示在一些矢量、标量和其他…

探索 SPL-404 协议标准:NFT 与 DeFi 的融合

在快速发展的数字资产领域中&#xff0c;NFT 协议标准持续演变&#xff0c;改变了我们对数字所有权和互动方式的理解。从 Art 到 Gamefi 等等&#xff0c;NFT 已经演变成数字经济的重要组成部分&#xff0c;吸引了广泛关注。遵循 ERC404 协议&#xff0c;SPL404 概念在 Solana …

掀桌子了!原来是咱们的大屏设计太酷,吓着前端开发老铁了

掀桌子了&#xff01;原来是咱们的大屏设计太酷&#xff0c;吓着前端开发老铁了 艾斯视觉观点认为&#xff1a;在软件开发的世界里&#xff0c;有时候创意和设计的火花会擦得特别亮&#xff0c;以至于让技术实现的伙伴们感到既兴奋又紧张。这不&#xff0c;我们的设计团队刚刚…