【Linux】编译器gcc/g++ 、程序翻译过程、动静态库
目录
- 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 gccyum 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查看可执行文件的链接方式

相关文章:
【Linux】编译器gcc/g++ 、程序翻译过程、动静态库
目录 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. …...
通义灵码-阿里云推出的AI智能编码助手
通义灵码体验地址 标题通义灵码是什么? 通义灵码是由阿里巴巴推出的基于通义大模型的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研发智能问答、异常报错排查等能力,并针对阿里云…...
构建智能生态,视频监控/安防监控EasyCVR视频汇聚流媒体技术在智能分析领域的应用
随着5G、AI、物联网(IoT)、云计算等技术的快速发展,万物互联的时代已经到来,全新的行业生态AIoT正在引领一场深刻的变革。在这场变革中,EasyCVR视频流媒体技术以其强大的视频处理、汇聚与融合能力,在智能分…...
LeetCode Hard|【460. LFU 缓存】
力扣题目链接 LFU全称是最不经常使用算法(Least Frequently Used),LFU算法的基本思想和所有的缓存算法一样,一定时期内被访问次数最少的页,在将来被访问到的几率也是最小的。 相较于 LRU 算法,LFU 更加注重…...
积极参与全球能源科技前沿对话,海博思创推动绿色低碳发展
在能源转型与绿色低碳发展的全球浪潮中,国内领先的储能解决方案供应商海博思创以卓越的技术实力和前瞻性的战略眼光,站在了行业变革的前沿。公司不仅在国内外多个重要展会上大放异彩,更通过一系列技术创新与深度合作,为全球能源行…...
[工具]-ffmpeg-笔记
朋友有一个需求,将视频文件转化为音频文件、音频文件获取音频转化为文本文件。 思路:通过ffmpeg转化视频为音频,通过百度ai提供的voice_t_text接口提取语音文本,但是需要将音频分割成1分钟内的pcm编码 ,采样率16000的…...
Android Fragment:详解,结合真实开发场景Navigation
目录 1)Fragment是什么 2)Fragment的应用场景 3)为什么使用Fragment? 4)Fragment如何使用 5)Fragment的生命周期 6)Android开发,建议是多个activity,还是activity结合fragment&…...
JavaWeb中的Servlet
本笔记基于【尚硅谷全新JavaWeb教程,企业主流javaweb技术栈】https://www.bilibili.com/video/BV1UN411x7xe?vd_sourcea91dafe0f846ad7bd19625e392cf76d8总结 Servlet Servlet简介 动态资源和静态资源 静态资源 无需在程序运行时通过代码运行生成的资源,在程序运…...
SpringBoot AOP 简单的权限校验
本篇文章的主要内容是通过AOP切面编程实现简单的权限校验。 书接上回登录与注册功能 我们的用户表里面不是有role(权限)这个字段吗 在JWT令牌的生成中,我们加入了role字段。 那么接下来,我们就可以通过这个字段来实现权限校验。 我这里就很简单&#x…...
Java生成Word->PDF->图片:基于poi-tl 进行word模板渲染
文章目录 引言I Java生成Word、PDF、图片文档获取标签渲染数据生成文档案例II 工具类封装2.1 word 渲染和word 转 pfd2.2 pdf转成一张图片III poi-tl(word模板渲染) 标签简介文本标签{{var}}图片标签表格标签引用标签IV poi-tl提供了类 Configure 来配置常用的设置标签类型前后…...
JVM内存模型笔记
1. 运行时数据区概述 JVM内存布局规定了Java运行过程中的内存申请、分配和管理策略。运行时数据区分为线程私有和线程共享两种。 2. 线程私有内存 程序计数器:存储当前线程执行的字节码指令地址。虚拟机栈:保存方法调用的局部变量和部分结果。本地方法…...
每日一练 - eSight 网管远程告警通知方式
01 真题题目 eSight 网管支持的远程告警通知方式包括:(多选) A.邮件 B.语音 C.短信 D.微信 02 真题答案 AC 03 答案解析 eSight 网管系统支持多种远程告警通知方式,包括邮件和短信。 这些通知方式可以帮助网络管理员及时了解网络设备的状态和告警信息࿰…...
[matlab] 鲸鱼优化算法优化KNN分类器的特征选择
目录 引言 智能优化算法概述 智能优化算法在KNN特征选择中的应用 应用步骤 UCI数据集 鲸鱼优化算法 一、算法背景与原理 二、算法组成与步骤 三、算法特点与优势 四、应用与挑战 代码实现 鲸鱼优化算法 主程序 打印结果 引言 智能优化算法在优化KNN(…...
vscode ssh-remote 疑似内存泄漏问题
vscode ssh-remote疑似内存泄漏问题 系统信息与版本号 版本:1.88.1(通用) 日期:2024-04-10T17:42:52.765Z Electron: 28.2.8 ElectronBuildId: 27744544 Chromium:120.0.6099.291 Node.js:18.18.2 V8&…...
初识自然语言处理NLP
文章目录 1、简介2、自然语言处理的发展简史3、语言学理论句法学(Syntax)语义学(Semantics)语用学(Pragmatics)形态学(Morphology) 4、统计与机器学习方法n-gram 模型隐马尔可夫模型…...
分布式系统架构-微服务架构
一.什么是分布式系统架构 分布式系统架构是指将一个单一的应用程序或服务拆分成多个独立的部分,这些部分可以在不同的计算机、服务器或者地理位置上运行,并通过网络进行通信和协作。分布式系统的设计旨在提高系统的可靠性、可用性和扩展性,同…...
docker搭建内网穿透服务
docker搭建内网穿透服务 frpfrpsfrpc zerotier构建 moon构建 planet查询客户端配置moon方法 nps frp 参考文章:https://blog.csdn.net/weixin_43909881/article/details/126526059 frps docker pull snowdreamtech/frps docker run --restartalways --network ho…...
html+css+js网页设计 体育 金轮健身7个页面
htmlcssjs网页设计 体育 金轮健身7个页面 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源码 1&…...
BGP基础简介(一)
AS 是一组运行相同IGP协议的设备组成的网络 AS号: 16bit:64512~65535为私有AS32bit:4200000000~4294967294为私有AS其余都是共有AS,需要向IANA申请 EGP 外部网关协议,bgp的前身,缺点:只发布路由信息,不…...
力扣面试150 反转链表 II 三指针
Problem: 92. 反转链表 II 👨🏫 参考题解 特殊情况 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val…...
Pixel Language Portal惊艳效果展示:全屏沉浸双栏布局下中英对照滚动同步+光标联动演示
Pixel Language Portal惊艳效果展示:全屏沉浸双栏布局下中英对照滚动同步光标联动演示 1. 像素语言传送门概览 **像素语言跨维传送门(Pixel Language Portal)**是一款基于腾讯Hunyuan-MT-7B核心引擎构建的创新翻译工具。与传统翻译软件不同,它将语言转…...
OpenClaw命令行增强:gemma-3-12b-it解释复杂指令并自动补全
OpenClaw命令行增强:gemma-3-12b-it解释复杂指令并自动补全 1. 为什么需要命令行增强工具 作为一个常年与终端打交道的开发者,我经常遇到这样的困境:记得某个命令的功能,却想不起具体参数;或者面对复杂的管道操作时&…...
OpenClaw自动化测试进阶:Phi-3-vision-128k验证APP多语言界面一致性
OpenClaw自动化测试进阶:Phi-3-vision-128k验证APP多语言界面一致性 1. 为什么需要自动化多语言测试 作为独立开发者,去年我发布了一款工具类APP到国际市场。当用户基数突破1万时,收到了30多条关于德语界面错译的差评——某个按钮的"取…...
BurpSuite为什么要配置证书
BurpSuite配置证书,核心是破解HTTPS加密、正常中间人抓包。不配置证书,浏览器报不安全、连不上;配置了证书,解密HTTPS、能看明文、能改包。为什么必须配置证书1.HTTPS是加密的浏览器和服务器之间的通信用TLS/SSL加密,防…...
C语言自学必看:最经典C语言书推荐
最经典的C语言书都在这了。 1、C Primer Plus 第6版 中文版C语言是鉴于满足程序员需求而被设计出来的,程序员借助C能够去访问硬件,能够操控内存里的位。C语言存有丰富的运算符,可使程序员得以简洁地表述自身意图。C语言不像Pascal那般严谨&am…...
30分钟搭建个人AI助手:OpenClaw+千问3.5-35B-A3B-FP8极速体验
30分钟搭建个人AI助手:OpenClaw千问3.5-35B-A3B-FP8极速体验 1. 为什么选择这个组合? 上周六下午,我盯着电脑里散落的会议纪要、待办事项和未整理的截图发愁时,突然意识到:与其手动处理这些琐事,不如让AI…...
OpenClaw云端体验指南:星图平台Qwen3-14B镜像+OpenClaw沙盒部署
OpenClaw云端体验指南:星图平台Qwen3-14B镜像OpenClaw沙盒部署 1. 为什么选择云端沙盒体验? 第一次接触OpenClaw时,我尝试在本地MacBook上部署,结果被复杂的依赖关系和环境配置劝退。直到发现星图平台的Qwen3-14B镜像OpenClaw沙…...
玉米脱粒机的毕业设计(论文+12张CAD图纸+开题报告+任务书……)
玉米脱粒机作为农业机械化的重要设备,其核心作用在于通过机械结构与动力系统的协同,实现玉米果穗与籽粒的高效分离。传统人工脱粒效率低、劳动强度大,而机械化脱粒通过旋转滚筒与筛网的配合,可显著提升处理速度,同时降…...
2025届毕业生推荐的六大AI学术工具推荐榜单
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 智能写作工具DeepSeek,于论文写作里有着显著辅助价值,用户能够输入研…...
火电行业低成本私有化 RAG 部署
全球 AI 算力市场正处于一场看不见的“围城”之中。 当苹果被曝出为了备战 iOS 18 的 AI 功能,疯狂扫货数千台 NVLX H100 GPU 集群,导致全球高端算力卡供货周期延长至 52 周以上时,对于传统重资产运营的行业——如火电企业——而言ÿ…...
