当前位置: 首页 > news >正文

【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 网管系统支持多种远程告警通知方式,包括邮件和短信。 这些通知方式可以帮助网络管理员及时了解网络设备的状态和告警信息&#xff0…...

[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…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

免费数学几何作图web平台

光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...