Linux下Centos7中的gcc/g++

news2024/11/20 20:34:45

命为志存。 —— 朱熹


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://www.coloradmin.cn/o/1954701.html

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

相关文章

QT vs2019编译报错LNK2019无法解析的外部符号

严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK2019 无法解析的外部符号 "public: __cdecl Dialog_Setting::Dialog_Setting(class QWidget *)" (??0Dialog_SettingQEAAPEAVQWidgetZ)&#xff0c;函数 "public: __cdecl QtWid…

全感知、全覆盖、全智能的智慧快消开源了。

智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。AI安全管理平台&…

0727,学什么学,周六就应该休息!!!!!

周六就应该休息&#xff0c;一天就忙了两小时也不是我的错喵 目录 UDP的小总结 01&#xff1a;使用select实现一个基于UDP的一对一即时聊天程序。 1.0 复读机服务器和树洞客户端 2.0 byby不了一点的敬业服务器&#xff01;&#xff01;&#xff01; 今天到此为止&#x…

Vue2.

vue2 模版语法 插值语法 标签体内容 指令语法 标签属性 v-bind: >> : 绑定 数据绑定 el与data的两种写法 理解MVVM模型 vue实例对象中的_proto_属性内 是 vue原型对象上的方法 数据代理 回顾object.defineproperty方法 数据代理定义&#xff1a; vue中的数据…

dify(docker)配置域名访问配置https

1. 要把证书放到 容器里面 放到nginx的目录里面 这个是在windows下 如果在Linux下 先上传到Linux服务器上然后复制到容器里面 docker-nginx-1 为容器的名字 2. 修改conf.d 里面的 default.conf 配置文件 把注释的代码放出来 3. 修改yaml文件 修改dify-main\docker下…

react中useReducer钩子函数的使用

1.代码展示 import { useReducer } from "react"// 1.定义reducer函数&#xff0c;根据不同action返回不同状态 function reducer(state, action) {console.log(state, action);switch (action.type) {case "INC":return state 1break;case "DEC&qu…

【黑科技】:Laravel 项目性能提升 20 倍

令人激动的黑科技&#xff1a;Laravel 项目性能提升 20 倍 这个项目能够在无需修改任何代码且无需第三方扩展的前提下&#xff0c;将你的 Laravel 项目性能提高 20 倍。它仅依赖于 PHP 原生的 pcntl、posix、fiber 和 sockets。 项目灵感 起因是看到官方发布的 PHP 8.1 更新…

CTF-NSSCTF[NISACTF 2022]

[NISACTF 2022]middlerce 考察&#xff1a;正则匹配回溯绕过 这里使用的是正则匹配的NIF匹配引擎,这个匹配引擎的原理是基于从后往前回溯的匹配机制 NIF匹配机制 当preg_match这个函数进行匹配时是匹配完后才根据匹配到与否来返回bool值 如果匹配到也要匹配完后才返回true,…

linux mysql 定时备份

1、创建备份文件夹 cd /homemkdir backup2、创建脚本文件 vim bkDatabaseName.sh加入以下内容&#xff08;/xp/server/mysql/bin/mysqldump是你的mysqldump备份命令&#xff0c;一般如果是正常安装的&#xff0c;可以直接用全局命令mysqldump&#xff0c;不用带前面的路径&am…

【前端 02】新浪新闻项目-初步使用CSS来排版

在今天的博文中&#xff0c;我们将围绕“新浪新闻”项目&#xff0c;深入探讨HTML和CSS在网页制作中的基础应用。通过具体实例&#xff0c;我们将学习如何设置图片、标题、超链接以及文本排版&#xff0c;同时了解CSS的引入方式和选择器优先级&#xff0c;以及视频和音频标签的…

19.延迟队列优化

问题 前面所讲的延迟队列有一个不足之处&#xff0c;比如现在有一个需求需要延迟半个小时的消息&#xff0c;那么就只有添加一个新的队列。那就意味着&#xff0c;每新增一个不同时间需求&#xff0c;就会新创建一个队列。 解决方案 应该讲消息的时间不要跟队列绑定&#xf…

介绍一款适合于程序员的手机浏览器

DT浏览器是一款适合于程序员的手机浏览器&#xff0c;主要功能有&#xff0c;资料分类收藏&#xff0c;图片资料转文字&#xff0c;智能问答&#xff0c;视频资料管理和播放&#xff0c;笔记本&#xff0c; DT浏览器使用教程之如何查空气质量&#xff0c; 在DT浏览器首页点空…

谷粒商城实战笔记-75-商品服务-API-品牌管理-品牌分类关联与级联更新

文章目录 一&#xff0c;引入Mybatis Plus分页插件二&#xff0c;品牌列表的模糊查询三&#xff0c;增加品牌测试数据四&#xff0c;开发后台品牌关联分类接口1&#xff0c;接口product/categorybrandrelation/catelog/list2&#xff0c;接口product/categorybrandrelation/sav…

第03课 Scratch入门篇: 键盘控制小猫

键盘控制小猫 入门篇适合新手&#xff0c;如您已经学过&#xff0c;可以忽略本节课&#xff01; 1、故事背景&#xff1a; 悠闲的小猫在舞台中散步&#xff0c;左左右右&#xff0c;上上下下… 2、实现原理&#xff1a; 让我们一起分析下&#xff0c;如何通过程序来…

Java 字符串 HashCode 的奇怪情况

过去 1.5 年以来&#xff0c;我一直在使用 Java 编程。最近&#xff0c;我在尝试对 Java 数据结构进行性能分析。为了亲自体验一下&#xff0c;我决定玩一下我最喜欢的数据结构&#xff0c;即 HashSet。HashSet 提供 O(1) 查找和插入时间。我测量并比较了在 HashSet 中查找具有…

kafka高性能的底层原理分析

目录 1.磁盘顺序写 2.零拷贝 3.数据压缩 4.消息批量处理 5.pageCache 6.稀疏索引 总结 Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。那么他是如何做到高性能的呢&#xff0c;本篇文章从宏观上分析一下&#xff…

论文阅读——Design of Environmental backscatter tag antenna for 5G Internet of things

文章目录 摘要一、背景二、系统模型三、天线设计A. 指标B. 天线结构描述C. 天线结构优化D. 天线结构确定 四、仿真结果总结 论文来源&#xff1a;https://ieeexplore.ieee.org/document/9379395 摘要 文章针对传统设备识别在电力物联网场景中存在的可靠性低和读取距离不足的问…

2024年陕西省职业院校技能大赛高职信息安全管理与评估样题

2024年陕西省职业院校技能大赛高职信息安全管理与评估样题 模块一竞赛项目试题 根据信息安全管理与评估技术文件要求&#xff0c;模块一为网络平台搭建与网络安全防护。本文件为信息安全管理与评估项目竞赛-模块一试题。 模块一 平台搭建与安全设备防护 竞赛任务 网络平台搭建…

[网鼎杯 2020 朱雀组]Nmap(详细解读版)

这道题考察nmap的一些用法,以及escapeshellarg和escapeshellcmd两个函数的绕过&#xff0c;可以看这里PHP escapeshellarg()escapeshellcmd() 之殇 (seebug.org) 两种解题方法&#xff1a; 第一种通过nmap的-iL参数读取扫描一个文件到指定文件中第二种是利用nmap的参数写入we…