【Linux】编译器gcc/g++ 、程序翻译过程、动静态库

news2024/11/26 18:51:04

目录

  • 1.gcc/g++ Linux编译器
    • 1.1. gcc与g++的安装
    • 1.2. gcc与g++用法
      • 1.2.1.gcc用法
      • 1.2.2. g++用法
    • 1.3. 程序翻译的过程
      • 1.3.1. 前提知识:
      • 1.3.2. 预处理(语言种类不变)
        • 条件编译用途:
      • 1.3.3. 编译(生成汇编语言)
      • 1.3.4. 汇编(生成二进制文件)
      • 1.3.5. 链接
  • 2. 函数库
    • 2.1. ldd 查看可执行文件的使用的函数库
  • 3. 动静态库
    • 3.1. 动静态库定义
    • 3.2. 动静态库的优缺点
    • 3.3. 如何切换使用动静态库

参考文章:编译器-gcc/g++与调试器-gdb的使用

1.gcc/g++ Linux编译器

1.1. gcc与g++的安装

g++与gcc的安装指令:

sudo提权/root 的权限下,才能进行安装

 yum install gcc
 yum install g++

1.2. gcc与g++用法

两者用法基本一致

1.2.1.gcc用法

注意:gcc只能编译C语言

(1)执行后会默认在该目录下形成一个 a.out 的文件

gcc + 文件名      

(2)-o 后面+生成指定文件
-o 的位置随意,但是后面必须是新的指定文件

gcc -o 可执行文件a .c文件     //编译该.c文件,生成一个名为a的可执行文件
gcc .c文件 -o 文件名M      //编译该.c文件,生成一个名为a的可执行文件

1.2.2. g++用法

注意:g++既可以编译C++,也可以编译C语言

(1)执行后会默认在该目录下形成一个 a.out 的文件

g++ + 文件名      

(2)-o 后面+生成指定文件
-o 的位置随意,但是后面必须是新的指定文件

g++ -o  A .cpp文件     //编译该.cpp文件,生成一个名为A的可执行文件
g++ .cpp文件 -o A  //编译该.cpp文件,生成一个名为A的可执行文件

1.3. 程序翻译的过程

1.3.1. 前提知识:

语言的发展:二进制语言 ->汇编语言 - >C语言 - >C++,java,python

问题:

先有语言还是先有该语言对应的编译器呢?例如,先有汇编语言呢,还是先有用汇编语言写的编译器呢? 先有该语言。

假设现在有汇编语言,那么二进制语言、以及对应的二进制编译器(该编译器可以把汇编语言,翻译成二进制语言),都已经存在了。

因为编译器本身就是个软件,因此利用二进制编译器,来编写汇编语言组成的新编译器。

然后使用新的编译器(汇编语言编译器),去编译和完善自身的代码。

同样,第一个把c语言编译器,肯定是利用汇编语言所写能够让C语言变为汇编语言的编译器。这是语言和编译器的自举的过程。

在这里插入图片描述

编译器的自举是指能够直接或间接地编译自己的编译器
实现自举的过程中,开发者需要用目标语言编写一个简易版本的编译器。接着利用已有的编译器(可能是另一个语言的编译器)来编译这个新编写的编译器。然后,使用新编译出来的编译器去编译和完善原先的源代码,不断迭代这个过程,直到编译器能足够处理自身语言的复杂性。
程序翻译的过程,就是从其他语言翻译为计算机能够识别二进制语言的过程,和上面的语言发展方向相反。

1.3.2. 预处理(语言种类不变)

预处理功能主要包括

  • 头文件展开:将头文件部分内容拷贝到源文件,有对应的拷贝条件
  • 宏替换
  • 条件编译
  • 去注释
    预处理指令是以#号开头的代码行。

在这里插入图片描述


 gcc –E test.c –o test.i

选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序


条件编译用途:

应用:

  • 对软件的专业版、普通版,这些功能不同的版本进行裁剪,实现功能的不同。
  • 防止头文件被重复包含
    我们可以通过给编译器传递不同的宏值,来进行对代码的动态裁剪。
gcc test.c -o test -D VERSION1=1

在这里插入图片描述
在这里插入图片描述

1.3.3. 编译(生成汇编语言)

编译阶段,gcc/g++首先检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,将代码翻译成汇编语言。

gcc -S test.i -o test.s

用户可以使用-S选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
-o选项是指目标文件,“ .s ”文件为已经过翻译的原始程序。

1.3.4. 汇编(生成二进制文件)

把上阶段的汇编文件,转为二进制(可重定位目标二进制文件)。

注意:该文件是不能够执行的**。**

gcc –c test.s –o test.o

-c选项可以得到汇编代码转化为“.o ”的二进制目标代码。

1.3.5. 链接

链接的主要任务就是将生成的各个“ .o ”文件进行链接,与系统中的库建立联系,生成可执行文件。

gcc/g++不带-E、-S、-c选项时,就默认生成预处理、编译、汇编、链接全过程后的文件。

gcc test.o –o test

若不用-o选项指定生成文件的文件名,则默认生成的可执行文件名为a.out。

2. 函数库

在我们编写代码时时常需要使用库函数中的函数,比如stdio.h中的printf函数,但当我们展开stdio.h文件后发现也只是有printf的函数声明,那么这些库函数的定义放在哪里了呢?

2.1. ldd 查看可执行文件的使用的函数库

查看的是动态链接,形成的可执行文件,依赖的共享库

ldd 可执行文件

在这里插入图片描述

就以stdio.h头文件举例,里面的库函数实现在了名为libc.so.6(C标准库)的库文件中。在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现printf函数了,而这也就是链接的作用。
在这里插入图片描述

平台要支持开发,就必须要提前在系统中安装 语言的标准头文件+库文件!

3. 动静态库

  • 库分为动态库与静态库
    • 在linux中,动态库文件以.so结尾, 静态库以.a结尾。
    • 在windows中,动态库文件以.dll结尾, 静态库以.lib结尾。
      动静态****库本质就是一个文件,里面包含了很多已经被编译好的代码。

3.1. 动静态库定义

静态库:

指编译链接时,把库文件的代码全部加入到可执行文件当中,因此生成的文件比较大,但在运行时也就不再需要库文件了,静态库一般以.a为后缀。

动态库:

在编译链接时并没有把库文件的代码加入到可执行文件当中,而是在程序运行时由链接文件加载库,这样可以节省系统的开销,动态库一般以.so为后缀。


3.2. 动静态库的优缺点

  • 动态库(链接方式:动态链接)

    • 优点:比较节省资源,不会出现太多的重复代码 。
      • 资源:磁盘,内存,网络等资源(例如:写了一个项目,里面有多个文件,这里文件中调用了很多个库里面的函数,虽然调用了很多函数,但是实现就只有一个,不会造成代码冗余的问题)
    • 缺点:对库的依赖性强,一旦库出现问题,那么所有使用了该库的程序全部都无法运行。
  • 静态库(链接方式:静态链接)

    • 优点:不依赖库(因为静态链接是将库文件代码直接拷贝到可执行文件中),可以在同类型平台中都直接运行。(同类型平台:都是Ubuntu)
    • 缺点:体积比较大,比较浪费资源,会出现太多的重复代码 (资源:磁盘,内存,网络等资源。)

3.3. 如何切换使用动静态库

动态链接:gcc -o 可执行程序名称 源文件(gcc默认使用动态链接)

静态链接:gcc -o 可执行程序名称 源文件 -static

在这里插入图片描述

如果想要使用静态链接?就需要 先安装 静态库
C/C++静态库的安装:命令

sudo yum install glibc-static libstdc++-static

file查看可执行文件的链接方式

在这里插入图片描述

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

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

相关文章

性能测试工具之JMeter

JMeter Apache JMeter应用程序是开源软件,是一个100%纯Java应用程序,旨在负载测试功能行为和衡量性能。它最初是为测试Web应用程序而设计的,但后来扩展到其他测试功能。 JMeter是一个免费、开源、跨平台的性能测试工具,于20世纪90年代后期面世。这是一个成熟、健全且具有…

‘Task‘ object is not callable ERROR

pycharm 调试异步的代码报错 TypeError: ‘Task‘ object is not callable ERROR: Exception in callback <Task 解决方法:点击菜单栏帮助-查找操作-注册表,在注册表中搜索python.debug.asyncio.repl禁用即可

卷大模型,还是卷应用?一次看明白

自从ChatGPT横空出世以来,中美之间围绕大模型的科技竞争愈演愈烈,也渐渐分化出两条差异化发展路线:一派侧重将AI能力投入应用场景,另一派则侧重让基础模型能力更强。于是,“卷应用”还是“卷大模型”成为中国许多新入场…

phpmailer如何配置SSL以发送安全电子邮件?

phpmailer支持哪些邮件附件类型?如何使用phpmailer? PHPMailer作为一个广泛使用的PHP邮件发送类库,支持通过SSL发送加密邮件,以确保信息在传输过程中的安全性。AokSend将探讨如何配置PHPMailer以使用SSL发送安全的电子邮件。 Ph…

M12防水分线盒双通道PNP型8路预铸线缆半导体制造设备

M12防水分线盒双通道PNP型8路预铸线缆,作为工业自动化设备中关键的组件之一,在提升系统稳定性与可靠性方面发挥着至关重要的作用。以钡铼技术DB系列为例,这款8路M12双通道预铸线缆分线盒在设计和材料选择上均体现了工业级的高标准&#xff0c…

解决方案:如何在虚拟机中扩展 Windows 11 C 盘,绕过恢复分区的限制!

第2章 背景 不管是虚拟化还是物理机,我们安装Windows 11 时候经常遇到无法直接扩容盘,我们简单介绍下Windows中C盘组成。 ### 恢复分区的目的 恢复分区是 Windows 操作系统安装过程中创建的一个特殊分区,主要用于以下目的: 1. …

如何修复 VLC 无法播放 MKV 问题

VLC 是一个媒体播放器,您可以用它来播放各种格式的音频或视频文件。但有时,您无法在 VLC 媒体播放器上运行 MKV 文件。问题可能是黑屏、没有声音、视频断断续续或错误消息(例如“无法识别的编解码器:VLC 无法识别音频或视频编解码…

自助创建 1Panel 应用

自助创建 1Panel 应用 前言 1Panel 作为一款开源的 Linux 服务器运维管理面板,其优质的 应用商店 想必也是很多人喜爱它的原因,除了官方的 应用列表 ,开源社区内也涌现出了许多优质的第三方应用商店资源,比如 okxlin/appstore 等…

【MySQL】什么是索引?了解索引的底层原理

索引的概念 索引是一种用于提高数据库查询效率的数据结构。它类似于书籍的目录,通过快速定位数据的方式,减少了数据检索的时间。索引在数据库表中可以被看作是一个指向数据的指针,它们存储了列的值及其对应行的位置,从而使得数据…

《老俞闲话|唯爱和热情不可辜负》读后感

《老俞闲话|唯爱和热情不可辜负》读后感 俞敏洪先生的这篇讲话充满了深情与智慧,他以自己丰富的人生经历和教育实践,向我们展现了一位教育家对于教育事业的热爱和对教师角色的深刻理解。 情感真挚,触动人心 俞敏洪先生的讲话中流…

嵌入式day25

进程线程 多任务编程 1、进程 2、线程 进程(process) 进行中的程序 --- 正在运行中的程序 进程 --- 程序的一次执行的过程 进程 是程序的一个实例 进程是跑起来的程序 一个程序可以对应多个进程 程序 静态 硬盘 进程 动态 内存 为什么需要进程…

ECharts 数据可视化 入门基本知识 下载安装常用的图表 【1】

ECharts一个基于 JavaScript 的开源可视化图表库,即将数据以图形或图像的方式展现成在屏幕上显示出来,这种方式称为数据可视化。数据可视化有助于我们分析数据,帮助我们更深入更直观的理解数据。今天回顾顺便总结一下echarts的基本知识&#…

基于SpringBoot和Vue框架的体育馆场地预约系统的设计与实现---附源码15155

摘要 本研究设计和开发了一款体育馆场地预约系统。该系统旨在提供一个方便、高效的方式,让用户能够轻松预约体育馆场地,并实现对预约信息的管理与统计。系统主要分为普通用户和管理员两个角色。普通用户可以浏览通知公告、体育资讯,查看各个体…

并发编程(第二天)

interrupt 方法详解 打断 sleep,wait,join 的线程 这几个方法都会让线程进入阻塞状态 打断 sleep 的线程, 会清空打断状态打断正常运行的线程 打断正常运行的线程, 不会清空打断状态打断 park 线程 打断 park 线程, 不会清空打断状态 如果打断标记已经…

Apache Tomcat服务器版本号隐藏

渗透测试时发现有一台服务器的404报错页面中,有Apache Tomcat的版本号信息显示,发生了信息泄露,可能导致服务器被攻击。如下所示: 解决步骤如下: 1. 隐藏HTTP响应头中的Server信息 Tomcat默认会在HTTP响应头中包含S…

Java面试八股之消息队列通常由哪些角色组成

消息队列通常由哪些角色组成 消息队列系统通常涉及几个核心角色,这些角色协同工作以实现消息的传递和处理。主要的角色包括: 生产者(Producer): 生产者是消息的创建者,负责将消息发送到消息队列中。生产者…

【八数码】

题目 错误代码 #include<bits/stdc.h> using namespace std; typedef pair<string, int> PII; #define x first #define y secondstring aim "12345678x"; int ans 0x3f3f3f3f; unordered_map<string, int> m; void bfs(string s, int pos) {qu…

《花100块做个摸鱼小网站! 》第二篇—后端应用搭建和完成第一个爬虫

一、前言 大家好呀&#xff0c;我是summo&#xff0c;前面已经教会大家怎么去阿里云买服务器&#xff08;链接在这&#xff0c;需要自取&#xff1a;https://developer.aliyun.com/huodong/dashiblogger?userCodemtbtcjr1&#xff09;&#xff0c;以及怎么搭建JDK、Redis、My…

R 语言学习教程,从入门到精通,R 数据类型(6)

1、R 数据类型 数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。 变量的类型决定了变量存储占用的空间&#xff0c;以及如何解释存储的位模式。 R 语言中的最基本数据类型主要有三种&#xff1a; 数字 逻辑 文本 数字常量主要有两种&#xff1a; 逻辑类型在许多…

vscode配置xdebug断点调试详细教程

注&#xff1a;环境为本地windows开发环境&#xff0c;编辑器为vscode&#xff0c;PHP集成环境工具为EServer vscode安装扩展并配置 安装PHP Debug 扩展中搜索 PHP Debug 并安装&#xff1a; 配置PHP Debug 1、点击扩展设置 2、在设置中&#xff0c;点击 setting.json 3、编…