Linux 学习之路 -- 工具篇 -- gcc / g++

在 Linux 系统中,gccg++ 是两个常用的编译工具,分别用于编译 C 和 C++ 代码。下面我将介绍gcc、g++的一些基本用法

目录

一、简单的认识

二、简单了解一下编译的过程             

<1> 预处理阶段 

<2>编译

<3>汇编

<4>链接

三、分别介绍编译过程

<1>预处理                                                                 

<2>编译

<3>汇编

<4> 链接

<5>简单介绍一下动静态库


一、简单的认识

如果没有gcc / g++ ,用yum 安装一下即可。

下面先简单举个例子帮助理解

这里我先创建一个test.c文件(这里最好还是带后缀,不然gcc / g++是无法识别的)。

然后再退出vim , 通过gcc 命令编译该文件,形成一个新的可执行文件

这里系统会默认生成a.out的可执行文件,(如果想要修改可执行文件名,使用gcc -o 源文件 + 要生成的可执行文件名,这里gcc 后面的顺序是可以随意的,但是新的文件名要紧跟在 -o 后面)再用./a.out执行该命令。

(这里我忘记加换行符号,不好意思) ,如果我们用vim 打开这个可执行文件,会发现里面的东西我们看不懂,可执行文件是给cpu 执行的,而cpu 只认二进制的代码,所以我们的可执行文件就得是二进制的,我们的高级语言只是提高了编译的速度,并没有改变底层的原理。

另外一个需要注意的点就是,gcc 只能编译C语言的代码,g++可以编C语言跟C++的代码。             

二、简单了解一下编译的过程             

<1> 预处理阶段 

 1.头文件展开                                                                                                                                           头文件展开其实就是把 c / c++ 头文件中需要的部分拷贝到当前的文件当中。

2. 去注释

        顾名思义,就是去掉代码中的注释

3.宏替换

        将宏代码替换

4.条件编译

        把条件通过的代码进行编译

在预处理后,文件里的代码还是C或C语言

<2>编译

把C / C++ 转成汇编代码

<3>汇编

把汇编转成二进制文件,这个二进制文件又叫可重定位二进制文件,这个文件是不能被执行的

<4>链接

三、分别介绍编译过程

程序的翻译一次性就会把上述的所有动作完成,所以我们就要通过不同的选项进行编译,形成特定的文件。

<1>预处理                                                                 

这里我们可以使用-E选项编译文件,形成预处理完后的文件,(下面我选择的都是test.c 文件进行编译)

退出后,我们实行gcc -E test.c 命令,发现系统默认就会把预处理后文件内容全打印到屏幕上,这对于我们观察非常不方便,所以我们可以使用gcc -E test.c -o test.i 这里我们将test.c 预处理形成的文件打包形成一个test.i 的临时文件。一般来说,这里的临时文件一般就是把原文件名的后缀改成.i ,表示是预处理后形成的文件。

实行上述命令后,我们打开test.i 文件。我们可以发现文件多出来了很多的代码,这些代码其实就是stdio.h这个头文件里面的内容拷贝到test.i 这个文件里面,而这个过程就叫作头文件展开,包括一些注释也被去掉了,这里其实就是把去注释的过程。

这里我们再加入条件编译,看看预处理后的文件内容。

这里我们先写一段带条件编译的代码

然后我们退出去,用gcc -E a.cpp -o 1.cpp -D vscode2=2 (-D 其实就是定义一个宏,并且在编译器处理源代码之前处理,把这个宏插入进去)。打开1.cpp 这个临时文件,跳到最后几行

我们可以发现,只有条件编译通过的代码才被保留,其余的都被删除了,所以我们可以给编译器传不同的宏值,来对代码进行动态的裁剪。

<2>编译

编译过程其实就是把C语言代码转成汇编代码(其他语言也是差不多),我们可以用-S 选项,这个选项就是把从开始进行程序的翻译当编译工作做完,就停下来。这里我用test.i 这个文件来演示一下,我们可以用gcc -S test.i -o test.s  来形成一个test.s 的文件。

打开这里我们就可以看见,这里的代码全变成了汇编代码。

<3>汇编

就是把汇编的代码转成二进制文件,这里我们可以用-c 选项来实现该操作,这里我用 gcc -c test.s -o test.o 形成一个test.o文件(这里的o, 代表的是obj文件的缩写,也就是目标文件),这里我们运行一下命令,运行完后打开文件。

这里我们会发现,文件内容没法阅读,这是因为文件是二进制文件,但是vim是文本编辑器。所以会有这种情况的出现。正常来说文件内容已经是二进制,就应该能被执行,但是我们却执行不了(哪怕我们给它加上可执行权限)。

这是因为二进制文件里面有非常多的函数声明,我们必需要链接到库里面找到对应的函数,才能使文件变成可执行文件。

<4> 链接

我们先用gcc test.o -o  test 形成一个叫test的可执行文件,我们可以用ldd 文件来查看可执行文件所依赖的库。这里的库一般分为静态库和动态库,在不同的系统库文件后缀不同

Linuxwindows
动态库.so.dll
静态库.a.lib

这里我们用ldd 命令查看文件所依赖的库

这里我们依赖的库就是C标准库,这里我们的系统也是将C语言一些头文件和库下载好了,所以我们能就能再linux 中就能用C进行开发的原因 (安装环境其实也就是安装这些库跟头文件)。

用ls /lib64* 命令,查看当前系统下的相关库

<5>简单介绍一下动静态库

动静态库本质上也是文件,但是两者是有区别的(使用动态链接)

动态库就是被多个使用者共享使用,一旦缺失所有的用户都无法使用(使用静态链接)。

静态库就是把自己需要的文件拷到可执行文件中。

动态库静态库
优点比较节省资源,不会有很多的重复代码 -- 这里的资源包括磁盘资源,内存,网络等等不依赖库,同类型平台中可以直接运行使用
缺点对库的依赖性比较强,一但库丢失,所有使用这个库的文件都将无法运行可执行程序的体积较大,比较费资源

这里就不多介绍了,后面文件部分再详细介绍

以上就是全部内容,希望对各位读者有些许帮助。文中如有不当之处,还望各位大佬指正,谢谢!!!

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

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

相关文章

ssm012医院住院管理系统+vue

医院住院管理关系 摘 要 随着时代的发展&#xff0c;医疗设备愈来愈完善&#xff0c;医院也变成人们生活中必不可少的场所。如今&#xff0c;已经2021年了&#xff0c;虽然医院的数量和设备愈加完善&#xff0c;但是老龄人口也越来越多。在如此大的人口压力下&#xff0c;医院…

JavaAgent 技术原理及实战

JavaAgent 技术原理及实战 1、引子2、JavaAgent 简单示例&#xff1a;方法开始和结束时打印日志2.1 创建 Agent2.2 编写验证 agent 功能的测试类2.2.1 使用JavaAgent 静态加载方式2.2.2 使用 JavaAgent 动态加载方式 2.3、小结 3、JavaAgent3.1 JavaAgent是什么&#xff1f;3.2…

linux 软中断入门

在 linux 中&#xff0c;任务执行的载体有很多&#xff0c;包括线程&#xff0c;中断&#xff0c;软中断&#xff0c;tasklet&#xff0c;定时器等。但是从本质上来划分的话&#xff0c;任务执行的载体只有两个&#xff1a;线程和中断。软中断和 tasklet 的执行可能在中断中&am…

DevSecOps安全工具链介绍

目录 一、概述 二、安全工具链在平台中的定位 2.1 概述 2.2 分层定位 2.2.1 不同阶段的安全工具 2.2.2 安全工具金字塔 2.3 安全流水线集成概览 2.3.1 概述 2.3.2 标准流水线集成安全工具链概览图 三、安全工具链分类 3.1 概述 3.2 威胁建模类 3.2.1 威胁建模的概念…

Vue企业级项目开发axios

axios二次封装 import axios from axios 导入element-plus的信息弹窗 imort {elMessage} from element-plus//利用axios的create方法创建实例&#xff0c;配置默认请求头和请求超时时间 const request axios.create({url:/api,可以使用已经配置好的环境变量import.meta.env.V…

计算机网络:数据链路层 - 封装成帧 透明传输 差错检测

计算机网络&#xff1a;数据链路层 - 封装成帧 & 透明传输 & 差错检测 数据链路层概述封装成帧透明传输差错检测 数据链路层概述 从数据链路层来看&#xff0c;主机 H1 到 H2 的通信可以看成是在四段不同的链路上的通信组成的&#xff0c;所谓链路就是从一个节点到相邻…

Android设备无线连接电脑及QXDM、QACT等工具的方法

首先样机和笔记本电脑连接同一wifi网络 adb root adb shell ifconfig复制inet addr地址 ping inet addr地址 adb tcpip 5555 adb connect (inet addr地址):5555 此时adb和机器使用wifi连接好了&#xff0c;可以拔出usb线 ipconfig查询电脑的IP地址 ipconfig使用adb在主机上…

2024系统架构师---解释器架构风格的概念与应用

解释器架构风格是一种软件架构模式&#xff0c;用于构建那些能够读取、解析并执行用户定义的命令或程序代码的系统。这种架构风格的关键在于提供一个运行时环境&#xff0c;它能够理解和执行预定义或用户定义的语言或指令集。通过这种方式&#xff0c;解释器模式能够为特定领域…

设计模式学习笔记 - 设计模式与范式 -行为型:1.观察者模式(上)

概述 前面已经学习了创建型和结构性设计模式&#xff0c;从本章开始开始学习行为型设计模式。创建型设计模式主要解决 “对象的创建” 问题&#xff0c;结构性设计模式主要解决 “类或对象的组合或组装” 问题&#xff0c;行为型设计模式主要解决 “类或对象之间的交互” 问题…

canvas+javascript 实现贪吃蛇游戏

引言 在当今数字化时代&#xff0c;编程已经成为一种极具创造力和趣味性的活动。通过编写代码&#xff0c;我们可以创造出各种各样的应用程序和游戏&#xff0c;其中包括经典的贪吃蛇游戏。本文将向您介绍如何使用 JavaScript 编程语言制作一个简单而有趣的贪吃蛇游戏&#xf…

Kafka(十一)管理Kafka

目录 管理Kafka1 命令行操作1.1 Topic操作1.1.1 创建主题1.1.2 列出集群所有主题1.1.3 列出主题详情1.1.4 增加主题分区数1.1.5 减少主题分区数1.1.6 删除主题 1.2 生产和消费1.2.1 控制台生产者1.2.2 控制台消费者 1.3 消费者群组1.3.1 列出并描述群组1.3.2 删除消费者群组1.3…

动态内存管理-错题合集讲解

空指针的解应用操作&#xff08;错误信息合集&#xff09; 越界访问 首先我们上一个代码&#xff0c;看看这个的代码的问题 这个代码的问题显而易见 &#xff0c;就是在循环里面&#xff0c;产生了越界访问的问题&#xff0c;这里你开辟了10个整形空间&#xff0c;但是从0-1…

【javaWeb 第九篇】功能接口开发流程以及常用注解

常用注解 准备-环境搭建开发规范开发流程 注解补充 准备-环境搭建 准备数据库表&#xff08;dept,emp&#xff09;准备后端SpringBoot环境 需要依赖&#xff1a; Web起步依赖&#xff0c;数据库驱动依赖&#xff0c;Mybatis依赖&#xff0c;lombok依赖配置文件application.pr…

9.Python类与对象

1 面向对象 类和对象都是面向对象中的重要概念。面向对象是一种编程思想&#xff0c; 即按照真实世界的思维方式构建软件系统。 例如&#xff0c;在真实世界的校园里有学生和老师&#xff0c;学生有学号、姓名、所 在班级等属性&#xff08;数据&#xff09;&#xff0c;还有…

标题:AI大模型学习:解放智能的未来之路

随着技术的不断进步和发展&#xff0c;AI大模型学习成为了当前人工智能领域的热点话题。AI大模型学习不仅仅需要研究者具备深厚的数学基础和编程能力&#xff0c;还需要对特定领域的业务场景有深入的了解。通过不断优化模型结构和算法&#xff0c;AI大模型学习能够不断提升模型…

MySQL核心命令详解与实战,一文掌握MySQL使用

文章目录 文章简介演示库表创建数据库表选择数据库删除数据库创建表删除表向表中插入数据更新数据删除数据查询数据WHERE 操作符聚合函数LIKE 子句分组 GROUP BY HAVINGORDER BY(排序) 语句LIMIT 操作符 分页查询多表查询-联合查询 UNION 操作符多表查询-连接的使用-JOIN语句编…

本地GPU调用失败问题解决3重新配置anaconda环境(成功)

1、右键“以管理员身份”打开anaconda prompt conda create -n python 3.9 2、使用官方下载源的配置 3、修改conda下载超时 conda config --set remote_connect_timeout_secs 60 conda config --set remote_read_timeout_secs 100 查看配置结果conda config --show 配置内…

122、内网安全——域信息收集应用网络凭据CS插件AdfindBloodHound

文章目录 理解域域信息搜集 理解域 假设有1000台计算机&#xff0c;运维人员需要为每一台计算机进行软件的安装、环境部署&#xff0c;实际上运维人员不可能亲自对每一台计算机进行软件的安装和环境部署。实际&#xff0c;将所有1000台计算机放入一个域中&#xff0c;域内有一…

多传感器标定——相机内参标定

文章目录 一、前言二、内参标定流程三、如何提升标定精度四、精度验证五、内外参联合标定 一、前言 之前写过一篇文章&#xff08;相机内参、外参、畸变系数简介&#xff09;&#xff0c;感觉应该把这几个东西说的还算明白&#xff0c;但是里边并没有深究该如何进行标定&#…

【软考---系统架构设计师】物联网和云计算

目录 一、物联网 二、云计算 一、物联网 物联网是实现物物相连的互联网络&#xff0c;其内涵包括两个方面&#xff1a;第一&#xff0c;物联网的核心和基础仍是互联网&#xff0c;是在互联网基础上延伸和扩展的网络&#xff1b;第二&#xff0c;其用户端延伸和扩展到了任何物…