【Linux系统】第五篇:Linux中编译器gcc/g++的使用

news2024/11/15 5:23:45

文章目录

  • 一、编译工具gcc/g++
  • 二、程序编译的过程
    • 🎄预处理
    • 🎄编译
    • 🎄汇编
    • 🎄链接
  • 三、动态链接和静态链接
    • 🌻动态链接
    • 🌻静态链接
    • 🌻 程序动、静态链接的区分

一、编译工具gcc/g++

gcc/g++ 分别是 C/C++ 的编译器,基本使用方法:

$ gcc [选项] 编译文件 [选项] 目标文件 
$ g++ [选项] 编译文件 [选项] 目标文件

二、程序编译的过程

在学习gcc/g++之前,我们先了解一下程序的翻译过程
在这里插入图片描述

🎄预处理

预处理可以完成的工作:头文件展开去注释宏替换条件编译

在以前学习中,我们是使用gcc/g++它是直接完成程序编译的过程,生成可执行文件,若我们想一步一步的看清楚过程,我们可以执行下面这样的一句指令,让代码预处理完之后就停下来

gcc -E test.c -o test.i
  • -E让翻译在预处理完成后就停下来
  • -o可以指定生成的目标文件名称,预处理完的文件一般后缀为.i

在这里插入图片描述

🎄编译

编译时,gcc会检查代码的规范性、是否有语法错误,以确定代码所做的工作,检查无误后gcc会把C语言处理为汇编语言。

gcc -S test.i -o test.s
  • -S让程序的翻译在完成编译后就停下来
  • 一般编译结束后生成的代码文件的后缀为.s

编译阶段生成的汇编代码,以供接下来的汇编阶段使用。

🎄汇编

汇编阶段会将编译阶段所形成的汇编代码文件变为一个二进制文件

gcc -c test.s -o test.o
  • -c让程序的翻译,做完汇编工作,变成可重定向目标二进制文件,就停下来
  • 一般汇编结束后生成的代码文件的后缀为.o

注意: 虽然生成的是二进制目标文件,但仍然不可以直接运行,准确来说该文件是可重定向的目标文件。相当于Windows下的.obj文件。

🎄链接

预处理、编译、汇编三个阶段统称为编译过程,完成了上述的编译过程,就到了程序翻译的最后一个阶段:链接。
链接完成后,就会生成可执行程序

gcc test.o -o test

默认生成的可执行程序名称为a.out-o选项可以自己定义名称

三、动态链接和静态链接

函数库的概念:
语言本省会提供库,例如,C语言提供的C标准库。我们通常使用printfscanf等等库函数,都是实现在库文件中的。我们自己只是写了这些函数的调用,没有对应的实现,只有当链接的时候,对应的实现,才和我们的代码关联起来。

🌻动态链接

通过链接器和库建立链接。直白理解就是当我们需要调用库中某些函数时,直接去库中查找

动态链接的优缺点

  • 优点:形成的可执行程序较小,下载便捷;节省内存,磁盘的存储空间
  • 缺点:依赖第三方库,每次执行程序都需要进行链接,所以运行速度相对慢一点

🌻静态链接

链接的时候,不是与库产生关联,而是将程序内部需要使用的方法,拷贝一份,完成静态链接。

静态链接的优缺点

  • 优点:

    • 在可执行程序中已经具备了所有执行程序所需要的任何东西,在执行的时候运行速度比较快
    • 不依赖第三方库,不受库升级或被删除的影响
  • 缺点:形成的可执行程序体积大

🌻 程序动、静态链接的区分

1. 查看程序是动、静态的方法

file 可执行程序

在这里插入图片描述
dynamically linked:中文意思就是动态链接

2. 查看程序依赖的库

ldd 可执行程序

在这里插入图片描述

3. 在Linux下库的命名

  • 动态库:libXXX.so
  • 静态库:libYYY.a

区分:
去掉前缀lib,去掉后缀.so,剩下的即使库的名称。
例如:libc.so.6依赖的就是C标准库

4. 使用静态链接

Linux中可执行程序默认使用动态链接,如果需使用静态链接,需要添加-static选项

gcc mytest.c -o mytest_static -static  #采用静态链接方式

在这里插入图片描述

在这里插入图片描述

注意:
一般而言,系统会自动携带动态库,静态库如果不存在,需要自己安装

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

5. 静态链接,从库中拷贝的代码,是从哪个库中拷贝?
静态链接需要系统中存在静态库,从该静态库中拷贝代码。
在这里插入图片描述

6. Windows下的动静态库的区分

  • 动态:.dll
  • 静态:.lib

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

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

相关文章

【wp】hgame2023 week3 RePwn

【wp】hgame2023 week3 Re&&Pwn Re cpp那个chacha20加密不会。 kunmusic 用dnspy逆dll,在Program的Main方法中找到了初始化的数据 下断点执行,拷贝出data 写一份脚本进行data与104的异或 def step_one():with open("./data", enc…

发明专利申请流程资料

​发明专利申请流程 依据专利法,发明专利申请的审批程序分为: 1、受理阶段 2、初步审查阶段 3、公布阶段 4、实质审查阶段 5、授权阶段 发明专利申请所需资料 1、发明专利请求书。 2、说明书。 3、权利要求书。 4、说明书摘要。 5、有附图的可同时提交说…

Actionchains在selenium中的使用方法

今天分享一下selenium最常用的ActionChains的使用,以及碰到的一些问题的解决。 1.selenium解决鼠标悬停的问题 今天抓取某个平台的数据时发现有的数据需要鼠标悬停在上面才能加载出来,于是就想到了使用ActionChains解决悬停的问题,下面是思…

计算机组成原理 | 第九章:控制单元的功能 | 微操作命令 | 时钟周期

文章目录📚微操作命令的分析🐇取指周期🐇间址周期🐇执行周期🥕非访存指令🥕访存指令⭐️🥕转移指令🐇中断周期📚控制单元的功能🐇控制单元的外特性&#x1f9…

分享微信报名小程序怎么做_瑜伽健身房培训报名小程序开发介绍

活动报名收费签到小程序,支持个人免费组织报名收款和现场签到。随时随地管理活动、发布活动、查看收入明细提现资金更效率。 活动报名收费签到小程序主要功能有: 在线报名:通过二维码或链接分享活动入口,亦可轻松放进入公众号。 …

客户端通过SSH连接Linux服务器超时问题解决方法汇总

🐚作者简介:花神庙码农(专注于Linux、WLAN、TCP/IP、Python等技术方向)🐳博客主页:花神庙码农 ,地址:https://blog.csdn.net/qxhgd🌐系列专栏:善假于物&#…

Windows无法进入睡眠模式怎么办?

睡眠模式是电脑的一种低功耗模式,能减少耗电。当你要离开电脑一阵,但又不想关闭文档和程序,就可以选择让电脑暂时休眠。 如果你的电脑无法进入睡眠模式,可以尝试下面几种方法: 更换电源选项检查电源命令使用电源疑难…

开源机器学习软件对AI的发展意味着什么?

作者| Max Langenkamp OneFlow编译 翻译|徐佳渝、杨婷 为什么要关注机器学习开源软件(MLOSS)?在我们看来,MLOSS对AI发展来说举足轻重,但未获重视。 机器学习开源软件是开源许可下发布的专为机器…

“易”起涨知识|人人都在追捧的低代码开发,到底有什么优势?

低代码的根本价值在于:劳动力转移。运营、产品能 cover 部分开发工作,实现研发流左移,敏捷迭代。 劳动力转移只是表面,低代码价值还是归属于自动化了信息传递。 产品用文字和交互图(PRD)表达了一遍完整的产…

List、Set、Map的区别

List、Set、Map的区别 ​ (图一) 1.面试题:你说说collection里面有什么子类。 (其实面试的时候听到这个问题的时候,你要知道,面试官是想考察List,Set) 正如图一,lis…

一文深入分析arm64 cache机制

说明: Kernel版本:4.14ARM64处理器,Contex-A53,双核使用工具:Source Insight 3.5, Visio 1. 概述 先来看一下经典的存储器层次结构图: 不同存储器技术的访问时间差异很大,CPU和主存…

2023年深圳前端培训机构排名,评价较高的机构分享

深圳前端培训机构排行榜的前三名是哪家呢?不少学生在选择学习前端开发的时候,都会通过网络来找一些相关的排行,评判哪家机构的教学比较好,今天小编就来针对这类相关的培训为大家分享一些内容,帮助大家选择更适合自己的…

RabbitMQ面试知识点总结

1.消息模式 P2P Worker Pub/Sub(exchange 4种) 四种交换机:direct/topic/headers/fanout,默认交换机是direct,其中Publish/Subscribe,Routing,Topics三种模式可以统一归为Exchange模式,只是创建时交换机的…

【LeetCode每日一题】【2023/2/1】2325. 解密消息

文章目录2325. 解密消息方法1:哈希表2325. 解密消息 LeetCode: 2325. 解密消息 简单\color{#00AF9B}{简单}简单 给你字符串 key 和 message ,分别表示一个加密密钥和一段加密消息。解密 message 的步骤如下: 使用 key 中 26 个英文小写字母第…

SpringBoot 监控统计(SQL监控、慢SQL记录、Spring监控、去广告)

1 基本概念Druid 是Java语言中最好的数据库连接池。虽然 HikariCP 的速度稍快,但是,Druid能够提供强大的监控和扩展功能 ,也是阿里巴巴的开源项目。Druid是阿里巴巴开发的号称为监控而生的数据库连接池,在功能、性能、扩展性方面&…

算法---冗余连接

题目 树可以看成是一个连通且 无环 的 无向 图。 给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间,且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edges ,edge…

蓝桥杯2022 python C组

蓝桥杯2022 python C组 跟之前的就四题不一样 第二题:特殊时间 就是i 从0-9,j从0-9 i是三个一样的,然后看看他们能不能成为 年 月日 时分 成为年只要大于0就好了,称为月日的话月要从1-12,日呢,特殊的日子…

Kylin入门实战(数据源添加 + Model定义 + Cube构建 + 结果查询 + 查询限制)

目录1. 入门实战目的2. Hive源数据准备3. 创建project并添加Hive数据源4. 定义model5. 定义Cube6. 构建cube7. 查询cube构建后的结果8. 查询限制1. 入门实战目的 实现从不同的维度统计员工的工资,例如从岗位类型、员工年龄、部门等不同维度,进行多维度的…

【LeetCode每日一题】【2023/1/30】1669. 合并两个链表

文章目录1669. 合并两个链表方法1:模拟1669. 合并两个链表 LeetCode: 1669. 合并两个链表 中等\color{#FFB800}{中等}中等 给你两个链表 list1 和 list2 ,它们包含的元素分别为 n 个和 m 个。 请你将 list1 中下标从 a 到 b 的全部节点都删除&#xff0…

亚信科技通信、交通行业数据库项目入选“星河”标杆、优秀案例

近日,由中国信息通信研究院、中国通信标准化协会大数据技术标准推进委员会(CCSA TC601)共同组织的第六届大数据“星河”案例评选结果公示,亚信科技及旗下亚信安慧支持完成的中国移动通信集团上海有限公司“业务支撑系统核心数据库…