【Linux】gcc的使用

news2025/1/17 8:58:42

文章目录

  • 一、前言
  • 二、gcc的基本使用
    • 1. 预处理
    • 2. 编译
    • 3. 汇编
    • 4. 链接
  • 三、函数库
  • 四、gcc常用选项总结


一、前言

在学习本文前,我们先简单回顾一下源代码被转换为可执行的机器指令的每个过程:

  1. 预处理(进行宏替换)
  2. 编译(生成汇编)
  3. 汇编(生成机器可识别代码)
  4. 链接(生成可执行文件或库文件)
    在这里插入图片描述

二、gcc的基本使用

gcc是英文词组“GNU Compiler Collection”的缩写,其功能是用于C/C++语言编译器。gcc是开源领域使用最广泛的编译工具之一,具有功能强大、兼容性强,效率高等特点。

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

1. 预处理

预处理的功能主要包括:替换宏定义、展开头文件、条件编译处理、去注释等。
预处理指令是以#号开头的代码行。

例:

gcc -E hello.c -o hello.i

选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程

选项“-o”是指目标文件, “.i”文件为经过预处理的 c 原始程序。

在这里插入图片描述

2. 编译

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

选项“-S”,该选项只进行编译而不进行汇编,生成汇编代码
例:

 gcc -S hello.i -o hello.s

在这里插入图片描述

3. 汇编

汇编阶段是把编译阶段生成的“.s”文件转成目标文件

选项“-c”,使用该选项后就可看到汇编代码已转化为“.o”的二进制目标代码

例:

 gcc -c hello.s -o hello.o

在这里插入图片描述

4. 链接

在成功编译之后,就进入了链接阶段。

例:

gcc hello.o -o hello

在这里插入图片描述


三、函数库

在上面涉及到一个很重要的概念:函数库

我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而 没有定义函数的实现。

那么是在哪里实现了“printf”函数呢?

答案是:系统把这些函数实现都放到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。

  • 函数库的分类:函数库一般分为静态库和动态库
  1. 静态库
    静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要系统库文件了。其后缀名一般为“.a
    -static:对生成的文件采用静态链接

在这里插入图片描述

  1. 动态库
    动态库与静态库相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。
    动态库一般后缀名为“.so” ,如前面所述的 libc.so.6 就是动态库。
    gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件

file命令:识别文件类型

动态链接:

在这里插入图片描述

静态链接:

在这里插入图片描述

ldd命令用于打印程序或者库文件所依赖的共享库列表

去掉前缀lib,去掉后缀. so剩下的就是库名称,所以lib c .so.6 是c语言的函数库

在这里插入图片描述

在这里插入图片描述

我们经常使用的很多命令都有对c库动态链接,如果我们删除c库那么这些命令也就无法使用了,这里就不演示了。

在这里插入图片描述

在这里插入图片描述


四、gcc常用选项总结

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

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

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

相关文章

windows什么录屏软件好用,windows屏幕录制软件

大部分人的电脑都是windows电脑,所以很多人都在找适合windows系统的录屏工具,windows什么录屏软件好用?我们到底该选择哪个录屏工具呢?今天我们就来给大家介绍windows版本的录屏工具。 一、易我录屏助手 这个工具很多人都比较熟悉…

艾美捷人重组MEGACD40L蛋白(可溶性)实例展示

艾美捷人重组MEGACD40L蛋白(可溶性)是一种高活性蛋白质,其中两个三聚体CD40配体分子通过脂联素/ACRP30/AdipoQ的胶原结构域人工连接。这种蛋白质非常有效地模拟体内CD40L的自然膜辅助聚集。 艾美捷人重组MEGACD40L蛋白(可溶性&…

openEuler快速入门(二)-openEuler命令行基础操作

系列文章目录 第一章 openEuler快速入门(一)-openEuler操作系统介绍 文章目录系列文章目录前言一、shell是什么二、Linux命令行操作技巧三、基础命令3.1、Linux命令分类3.2、目录和文件3.2.1 相对路径和绝对路径3.2.2 处理目录的常用命令ls:cd:pwd&…

供应N3-PEG-COOH,Azide-PEG-acid,叠氮-聚乙二醇-羧基可增加溶解度

一:产品描述 1、名称 英文:Azide-PEG-acid,N3-PEG-COOH 中文:叠氮-聚乙二醇-羧基 2、CAS编号:N/A 3、所属分类:Azide PEG Carboxylic acid PEG 4、分子量:可定制,1000、2000、…

搭建Redis -Sentinel架构

准备服务器 master节点:192.168.1.121 从节点1:192.168.1.122 从节点2:192.168.1.123 安装详细步骤 1、下载安装包 https://redis.io/download/ 2、进入工作目录 $cd /home 3、解压安装包 $tar -zxvf redis-6.2.6.tar.gz 4、建立软连接 $l…

OpenCV_06 图像平滑:图像噪声+图像平滑+滤波

文章目录1 图像噪声1.1 椒盐噪声1.2 高斯噪声1.3 瑞利噪声1.4 伽马噪声1.5 指数噪声1.6 均匀噪声2 滤波器2.1 均值滤波器2.1.1 算数平均值滤波器2.1.2 几何均值滤波器2.1.3 谐波平均滤波器2.1.4 反谐波平均滤波器2.2 统计排序滤波器2.2.1 中值滤波器2.2.2 最大值滤波器2.2.3 最…

翻开spring源码横看竖看,满屏只有四个字,看不懂啊。幸好我有大神的深度剖析spring源码,轻松看懂

前言 有一天,我翻开源码横看竖看,满屏只看到四个字,我看不懂啊。 所以是不是曾和我一样迷失在毫无头绪的源码里,在各种类和方法里翻山越岭,却如同管中窥豹。是的话,要不今晚早点睡? 呸&#x…

前端学习路线(二)

在前端学习路线(一)一章中我们讲了关于前端三剑客和jq与js的问题,并且简要的说明了js高级是什么,那在本章节我们主要从如何学习js高级开始进行讲述,并对es6如何学习,bootstrap学不学和学什么,并…

Tomcat部署及优化

目录 一. Tomcat的介绍 1.2 Tomcat核心组件 1.2.1 核心组件的作用 1.3 servlet简介 1.4 JSP介绍 1.5 Tomcat功能组件结构 1.6 Tomcat请求过程 二.Tomcat服务部署 2..2 安装JDK​编辑​编辑​编辑 2.3 设置JDK环境变量​编辑​编辑 2.5 优化tomcat启动速度 2.6 tom…

【JavaScript】制作一个抢红包雨页面

开发H5项目,有时会遇到一个需求,需要制作抢红包,或者下红包雨的网页,这个实现步骤,如果拿现成的改来做是容易的,但是想着全靠自己做是不容易的,接下来开始讲,想不想自己做&#xff0…

嵌入式开发学习之--点亮LED灯(下)

上篇我们主要学习的是环境搭建和实际操作,这篇详细记录一下整个思考的过程。 首先,我们需要想一个问题,这个灯为什么会亮? 物理上来说,LED灯属于发光二极管,只要有正确的电压就会发亮。也就是说&#xff…

01 DevOps 之 Git 命令使用

1. 前言 由于项目没有外网,需要在内网打镜像。但自己对git 还不是太熟悉。看着pipline 一脸懵逼。所有针对git 命令在工作中常用的参数及用法简单学习记录下。因为git 是DevOps中的编码的一部分,下面先介绍下DevOps整体的框架。 1.1 DevOps介绍 DevOp…

Linux-磁盘分区,挂载

Linux分区 Linux来说无论有几个分区,分给哪一个目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构,Linux中每个分区都是用来组成文件系统的一部分 Linux采用了一种载入的处理方法,它的整个文件系统包含了…

智能运维应用之道,告别企业数字化转型危机

面临的问题及挑战 数据中心发展历程 2000 年中国数据中心始建,至今已经历以下 3 大阶段。早期:离散型数据中心 IT 因以项目建设为导向,故缺乏规划且无专门运维管理体系,此外,开发建设完的项目均是独立运维维护&#…

rust编程初探-猜数游戏(chapter 2)

目录 1. 创建项目 2. 猜数的输入 3. 随机数生成 3.1 rand库依赖 3.2 随机数生成 4. 猜数和随机数的比对 4.1 std::cmp::Ordering类型 4.2 match表达式(expression) 4.3 输入类型的转换 5. 支持多次猜测(使用循环) 6. 错…

MySql学习之慢SQL优化和慢SQL案例

一、慢SQL优化思路 慢查询日志记录慢SQLexplain查询SQL的执行计划profile分析执行耗时Optimizer Trace分析详情 1、慢查询日志记录慢SQL show variables like slow_query_log%; show variables like long_query_time;查看下慢查询日志配置,我们可以使用show vari…

对MMVAE中IWAE代码实现的理解

原始的IWAE 优化目标: LIWAE(x1:M)Ez1:K∼qΦ(z∣x1:M)[log⁡∑k1K1KpΘ(zk,x1:M)qΦ(zk∣x1:M)](1)\mathcal{L}_{\mathrm{IWAE}}\left(\boldsymbol{x}_{1: M}\right)\mathbb{E}_{\boldsymbol{z}^{1: K} \sim q_{\Phi}\left(\boldsymbol{z} …

JavaScript

目录 1、JavaScript简介 2、JavaScript引入方式 2.1、内部脚本 2.2、外部脚本 3、JavaScript基础语法 3.1、书写语法 3.2、输出语句 3.3、变量 3.4、数据类型 3.5、运算符 3.5.1、 和 的区别 3.5.2、类型转换 3.6、流程控制语句 3.6.1、if语句 3.6.3、for循环语…

【毕业设计】时间序列天气预测系统 - LSTM

文章目录0 前言1 数据集介绍2 开始分析2.1 单变量分析2.1.1 温度变量2.2 将特征和标签切片2.3 建模2.4 训练模型2.5 多变量分析2.5.1 压强、温度、密度随时间变化绘图2.5.2 将数据集转换为数组类型并标准化2.5.3 多变量建模训练训练3 最后0 前言 🔥 Hi,…

vue项目身份认证,vuex,token

vuex存储用户登录信息以及解决页面刷新vuex数据丢失问题 我的文章:vuex页面刷新数据丢失问题的多种解决方法 有写到 身份认证 虽然完成了登录功能,但实际上现在用户没登录也能访问(对应的url),这样的话显得登录功能毫无意义。 为了让登录变得有意义&am…