【Linux】gcc(工具篇)

news2024/12/28 3:48:08

文章目录

  • 背景知识
  • gcc的使用
    • 预处理(进行宏替换)
    • 编译(生成汇编)
    • 汇编(生成机器可识别代码)
    • 连接(生成可执行文件或库文件)
  • gcc选项
  • 函数库
    • 函数库一般分为静态库和动态库两种
    • C/C++静态库的安装




背景知识


g++是编译cpp代码的编译器,而gcc是编译c语言的编译器,它们的选项都是一样的,所以本章主要就介绍gcc。

  1. 预处理(进行宏替换)
  2. 编译(生成汇编)
  3. 汇编(生成机器可识别代码)
  4. 连接(生成可执行文件或库文件)

关于这些不了解的可以看看这篇文章:程序环境


gcc的使用


格式:

gcc [选项] 要编译的文件 [选项] [目标文件]

预处理(进行宏替换)

  • 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
  • 预处理指令是以#号开头的代码行。
  • 实例: gcc –E hello.c –o hello.i
  • 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
  • 选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。

编译(生成汇编)

  • 在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
  • 用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
  • 实例: gcc –S hello.i –o hello.s

汇编(生成机器可识别代码)

  • 汇编阶段是把编译阶段生成的“.s”文件转成目标文件
  • 读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
  • 实例: gcc –c hello.s –o hello.o

连接(生成可执行文件或库文件)

  • 在成功编译之后,就进入了链接阶段。
  • 实例: gcc hello.o –o hello


gcc选项


  • -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
  • -S 编译到汇编语言不进行汇编和链接
  • -c 编译到目标代码
  • -o 文件输出到 文件
  • -static 此选项对生成的文件采用静态链接
  • -g 生成调试信息。GNU 调试器可利用该信息。
  • -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
  • -O0 -O1 -O2 -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
  • -w 不生成任何警告信息。
  • -Wall 生成所有警告信息。
  • -std=c99指定了编译器应遵循C语言的C99标准进行编译
  • -std=c11指定了编译器应遵循C语言的C11标准进行编译


函数库


  • 我们的C程序中,并没有定义printf的函数实现,且在预编译中包含的stdio.h中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实printf函数的呢?
  • 最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径/usr/lib下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数printf了,而这也就是链接的作用。

函数库一般分为静态库和动态库两种

  • 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为.a,Windows系统下后缀名一般为.lib
  • 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为.so,Windows系统下后缀名一般为.dll,如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。 gcc hello.o –o hello
  • gcc默认生成的二进制程序,是动态链接,这点可以通过 ldd 命令验证。
    ldd 查看一个可执行程序所依赖的库文件。使用方式如下:
ldd [可执行文件名]

我们在使用gcc或者g++编译一个源文件时,默认是使用动态链接的方式区编译,如果想使用静态链接的话,要带上选项-static

C/C++静态库的安装

但是在这之前,要先确保是否安装得有静态库,否则就会出现以下报错
在这里插入图片描述

如果没有的话,可以登录root账户使用以下命令来进行安装:

yum install -y glibc-static libstdc++-static

在这里插入图片描述
这两个可执行文件是我分别使用动静态库链接编译形成的可执行文件。可以看出它们的体积大小差距还是挺大的。

静态库
优点:不依赖库,同类型平台中都可以直接运行使用。
缺点:可执行程序体积比较大,比较浪费资源。

动态库
优点:比较节省资源(磁盘,内存,网络等),不会出现太多的重复代码。
缺点:对库的依赖性比较强,一旦库丢失,所有使用这个库的程序都无法运行。

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

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

相关文章

Python 程序设计基础教程

Python 程序设计基础教程 撰稿人:南星六月雪 第 一 章 变量与简单数据类型 1.1 变量 先来观察以下程序: world "Hello Python!" print(world)world "Hello Python,I love you!" print(world)运行这个程序,将看到两…

一个利用率超高的大数据实验室是如何练成的?

在当今这个数据爆炸的时代,大数据已成为推动各行各业创新与发展的核心动力。一个高效运转、利用率超高的大数据实验室,不仅是技术创新的摇篮,更是企业竞争力的重要体现。那么,如何构建并维持这样一个实验室呢?本文将探…

【机器学习】软输出和硬输出的基本概念和区别、如何选择软输出还是硬输出、联系函数的作用以及线性判别分析和逻辑回归的基本概念(含python代码)

引言 在机器学习中,“软输出”(Soft Output)和"硬输出"(Hard Output)是两种不同的预测输出形式,通常用于分类问题中 文章目录 引言一、软输出和硬输出1.1 硬输出(Hard Output&#xf…

深入理解C语言指针原理——深入底层机制

概述 在C语言中,指针是处理内存的核心工具。为了更好地理解指针如何工作,我们需要深入了解指针与底层硬件和操作系统之间的交互方式。本文将探讨指针的底层实现、内存布局、以及它们如何影响程序的行为。 内存模型 虚拟内存 现代操作系统为每个进程提…

Java算法—排序篇之快速排序(Quick sort)

快速排序(Quick sort) 核心思路: 从数列中挑出一个元素,一般都是左边第一个数字,称为 “基准数”;创建两个指针,一个从前往后走,一个从后往前走。先执行后面的指针,找出第一个比基…

io进程----库

目录 一丶定义 二丶分类 1.静态库 2.动态库 三丶静态库制作 四丶动态库制作 总结: 一丶定义 当使用别人的函数时除了包含头文件以外还需要有库 头文件:函数声明、结构体等类型定义、头文件、宏定义、其他头文件等 库:把一些常…

Java 使用QQ邮箱的接收发送功能,入门级教程

进入qq邮箱主页面,点击账号 下滑找到POP3...如果没有开启,需要开启,开启后,点击管理服务 然后点击生成授权码 按照步骤执行完成后,会给你需要的授权码 1.拿到授权码后,导入相关依赖,和yml相关配…

基于STM32开发的智能家居温度控制系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化温度监测与显示风扇/加热器控制Wi-Fi通信与远程监控应用场景 家庭环境的智能温度管理办公楼的节能温控系统常见问题及解决方案 常见问题解决方案结论 1. 引言 随着人们对生活质量…

OZON电子类目解封,OZON新品飙升榜

Ozon电子类目的解封对于商家来说是一个重要的机会,可以重新进入市场并恢复销售。 Ozon电子类目解封选品:m6z.cn/5H6fQR(复制浏览器打开) Top1 便携式音响 Портативная колонка Bluetooth с караоке м…

多意图指令识别项目调研及整理

多意图算法及专利调研整理 AGIF: An Adaptive Graph-Interactive Framework for Joint Multiple Intent Detection and Slot Filling 短文本多意图解析 https://zhuanlan.zhihu.com/p/405096922 多意图语义解析包括多意图发现MID(Multi-intent discovery&#xf…

搭建go开发环境

下载go软件压缩包 解压压缩包到D:/Program Files 验证是否安装成功 配置系统环境变量Path

甄选范文“论软件质量保证及其应用”,软考高级论文,系统架构设计师论文

论文真题 软件质量保证(Software Quality Assurance, SQA)是指为保证软件系统或软件产品充分满足用户要求的质量而进行的有计划、有组织的活动,这些活动贯穿于软件生产的整个生命周期。质量保证人员负责质量保证的计划、监督、记录、分析及报告工作,辅助软件开发人员得到高…

arthas源码刨析:arthas 命令粗谈 dashboard watch retransform (3)

文章目录 dashboardwatchretransform 前面介绍了 arthas 启动相关的代码并聊了聊怎么到一个 shellserver 的建立。 本篇我们来探讨一下几个使用频次非常高的命令是如何实现的。 在开始之前,我们先概要地了解一下 arthas 命令的几个思路。 自定义命令,普通…

【Hexo】hexo-butterfly主题添加非主站提示

本文首发于 ❄️慕雪的寒舍 说明 因为hexo可以很方便的在多个平台上免费部署,为了让自己的博客能uptime更久一段时间,很多老哥都和我一样,把自己的hexo博客在好多个平台上都部署了一份。 但是我一直想要一个功能,就是在别人访问…

可商用插画

可商用插画 https://www.88sheji.cn/favorites/free-illustration

5G+智慧工业园区解决方案

1. 智慧工业园区架构概览 智慧工业园区采用多层架构设计,包括展示层、应用层、服务层、数据层和安全保障体系。此架构利用云计算、物联网和移动通信技术,实现园区管理的数字化和智能化。 2. 园区大脑功能 园区大脑作为智慧园区的“中枢神经”&#xf…

校园招聘,在线测评包括哪些内容?

一年两次的校园招聘(秋招和春招),面对众多职业测评的时候,很多人都会觉得无从下手,从而在竞争中失利。根据实践中的情况来看,校园招聘时的测试其实不难,求职者提前准备,想通过在线测…

SLAM十四讲ch3课后习题

1.验证旋转矩阵是正交矩阵。 2.验证四元数旋转某个点后,结果是一个虚四元数(实部为零),所以仍然对应到一个三维空间点。 注意:目前市面上所有的博客都说旋转四元数的逆是共轭除以模的平方 ,这么算很正确但…

免费分享:2023甘肃省地质灾害点数据集(附下载方法)

滑坡,在一定自然条件下的斜坡上的十体或岩体在外界的影响和自身的作用下沿着一定的软弱面或带,发生以水平心移为主的变形现象。地面沉降又称为地面下沉或地陷,是在自然或人类工程的影响下,由于地下松散土层固结收缩压密作用&#…

无人机飞手培训考证,超视距大载重吊运组装训练全学就业有保障

关于无人机飞手培训考证,是否必须学习超视距飞行、大载重吊运以及组装训练以确保就业保障,这个问题涉及多个方面,以下是对各点的详细分析: 一、超视距飞行 必要性分析: 超视距飞行是无人机高级应用中的一个重要领域…