Linux的编译器——gcc/g++(预处理、编译、汇编、链接)

news2024/11/25 10:38:24

文章目录

  • 一.程序实现的两个环境
  • 二.gcc如何完成
    • 1.预处理
    • 2.编译
    • 3.汇编
    • 4.链接
  • 三.动态库与静态库
    • 对比下二者生成的文件大小
  • 四.gcc常用选项

前言:
本文主要认识与学习Linux环境下常用的编译器——gcc(编译C代码)/g++(编译C++代码)的常用指令等、程序实现的两大环境、动态库与静态库的理解等。

一.程序实现的两个环境

任何一个C程序的实现都要经过翻译环境执行环境

在翻译环境中又分为4个部分,预编译、编译、汇编与链接。在各个阶段主要完成的任务有:

  1. 预编译(预处理):头文件的包含、注释的删除、#define符号的替换
  2. 编译:将C语言代码转化为汇编代码
  3. 汇编:把汇编指令转化为二进制指令
  4. 链接:合并符号表和段表,生成可执行程序

在这里插入图片描述

二.gcc如何完成

通过gcc指令的不同选项可查看各阶段所形成的文件

格式:gcc [选项] [目标文件名] -o [生成文件名]

首先在Test.c文件中写好C代码:

//Test.c
#include<stdio.h>
 
#define N 100
 
//这是一段注释.....
 
int main()
{
	int n = 0;
	printf("Hello World\n");
	printf("%d\n", n + N);
	return 0;
}

1.预处理

查看 Test.c 预处理后的结果,-E选项的作用是让 gcc 在预处理结束后停止编译过程;-o 的作用是将预处理后的内容保存到 test.i 文件中

gcc -E Test.c -o test.i

在这里插入图片描述

如图所示,预处理阶段进行了头文件包含、注释的删除、#define的替换等。

2.编译

接下来将刚刚生成的 test.i 进行编译,并在编译之后停下来,将结果写入 test.s 中。gcc所用选项为 -S

gcc -S test.i -o test.s

在这里插入图片描述

我们虽然可能没学习过汇编语言,但依旧隐约认识到这些就是汇编代码;可见编译阶段就是将C代码翻译为汇编指令。

3.汇编

gcc所用选项为 -c-o 将结果写入到test.o 中。

gcc -c test.s -o test.o

在这里插入图片描述
正如我们所见,汇编完成之后都这这样的乱码。其实汇编之后,生成的文件为二进制文件,是用来给计算机看的,咱们已经看不懂了。

4.链接

编译完成之后就进入了链接阶段,链接完成之后就会生成可执程序 test了。

gcc test.o -o Test

在这里插入图片描述

但是关于链接,我们需要知道它在链接什么。
比如为什么没有定义过函数 printfreturn …等,但却可以使用它的功能?

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

三.动态库与静态库

函数库一般分为动、静态库两种。二者的区别可以理解为私有与公共的区别。就好比我们需要读一本《C和指针》,有两种方法可以选。一种是自己买一本,只有自己可以用,用起来还挺方便,缺点就是得花钱;第二种是去图书馆借书,图书馆的资源被所有人共享。

gcc 进行函数库的链接时可选择静态链接或者动态链接。

  1. 静态链接就类似于自己买书看,只给自己看同时还费钱(浪费内存),静态链接时会将库文件的代码全部加入到可执行文件中,因此生成的文件比较大。
  2. 动态链接类似于去图书馆借书。函数库就放在某个固定的地方,哪个程序想去使用就去自己去加载它。

Linuxgcc默认使用动态链接。

对比下二者生成的文件大小

//采用静态链接
gcc -static Test.c -o Test_static
//默认采用动态链接
gcc  Test.c -o Test

若在静态链接时出错,可能是因为你的Linux 没有安装C语言的静态库,须手动安装。

//安装C语言静态库
yum install -y glibc-static

在这里插入图片描述

由此可见静态链接比动态链接生成的可执行文件大。

四.gcc常用选项

以下是gcc编译器常用选项汇总

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


本文到此结束,码文不易,还请多多支持哦!

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

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

相关文章

ECharts社区 合集整理

1、PPChart 地址&#xff1a;http://ppchart.com/#/ 2、DataInsight 地址&#xff1a;http://chartlib.datains.cn/echarts 3、isqqw 地址&#xff1a;https://www.isqqw.com/ 4、makeapie 地址&#xff1a;https://www.makeapie.cn/echarts 5、Chart.Top 地址: http://chart.…

【二维属性+贪心+双指针】Wannafly 挑战赛15 A

Wannafly挑战赛15_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ (nowcoder.com) 题意&#xff1a; 思路&#xff1a; 经典中的经典中的经典 还是一样双指针把可行解放入DS中&#xff0c;然后求最优解 值得注意的是&#xff0c;我们说的双指针的单调性&#xff0c…

SpringCloudAlibaba集成RocketMQ实现分布式事务事例(一)

SpringCloudAlibaba集成RocketMQ实现分布式事务事例(一) 业务需求 用户请求订单微服务 order-service 接口删除订单(退货),删除订单时需要调用 account-service的方法给账户增加余额,一个典型的分布式事务问题。 代码实现 事务消息有三种状态: TransactionStatus.Commi…

第162天:应急响应-网站入侵篡改指南Webshell内存马查杀漏洞排查时间分析

知识点 #知识点 -网页篡改与后门攻击防范应对指南 主要需了解&#xff1a;异常特征&#xff0c;处置流程&#xff0c;分析报告等 主要需了解&#xff1a;日志存储&#xff0c;Webshell检测&#xff0c;分析思路等 掌握&#xff1a; 中间件日志存储&#xff0c;日志格式内容介绍…

操作系统复习大纲

目录 第一章 操作系统引论 1. 理解操作系统的目标 2. 理解 OS 的作用 3. 理解操作系统的功能 4. 深入理解多道、并发 OS 的含义 5. 掌握多道批处理 OS、分时 OS、实时 OS 的基本特性&#xff0c;掌握分时 OS 基本特点 和响应时间概念和公式 Tn q。 6. 了解 OS 设计目的 7. 理解…

【枚举倍数】找一找

A-找一找_Wannafly挑战赛9 (nowcoder.com) 题意&#xff1a; 思路&#xff1a; 注意细节 ai1时特判 枚举时最好枚举 i Code&#xff1a; #include <bits/stdc.h>//#define int long longusing namespace std;const int mxn1e610; const int mxe1e510; const int m…

Spring面试题--SpringBoot自动配置原理

注解解析 面试回答 面试官&#xff1a;Springboot自动配置原理 候选人&#xff1a; 嗯&#xff0c;好的&#xff0c;它是这样的。 在Spring Boot项目中的引导类上有一个注解SpringBootApplication&#xff0c;这个 注解是对三个注解进行了封装&#xff0c;分别是&#xff1a;…

手写Spring底层原理

一.创建maven项目 二.创建对应的文件夹&#xff0c;分别是spring和nickel 说明&#xff1a;spring文件夹用于存放spring相关的文件&#xff0c;nickel用于存放相应的配置文件和相关被spring加载的bean对象。 三.创建对对应的文件 3.1创建CommponentScan注解文件 package com…

网工内推 | 国内知名云服务商,IE证书优先,最高18k*15薪

01 UCloud 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、负责UCloud全球骨干网或数据中心网络工作&#xff0c;包括设备技术选型、架构运营方案设计、日常运维支持&#xff1b; 2、持续提升网络稳定性与性能。 任职要求&#xff1a; 1、本科及以上学历&#xff…

Vue中使用 file-saver 实现导出excel文件

1、先下载一波 file-saver yarn add file-saver 2、封装导出-接口的请求 需要修改请求的数据类型 responsetype 的值为 blob responsetype 默认值是 json 可省略不写 // 导出excel export function exportExcel() {return http({url: /sys/user/export,responseType: b…

TOPSIS法

优劣解距离法&#xff1a;评价类模型&#xff0c;有准确的评判标准后得到评分。 构造计算评分的公式&#xff1a; (x-min)/(max-min) 或(x-min)/((max-x)(x-min)) 指标类型 极大型指标&#xff1a;越大越好。 极小型指标&#xff1a;越小越好。 中间性指标&#xff1a;既…

JavaWeb实现学生管理系统

JavaWeb实现学生管理系统 一、项目介绍二、项目结构三、前期准备1.配置maven环境&#xff0c;在pom.xml配置文件中配置项目所依赖的jar包2.在MySql数据库中&#xff0c;创建登录注册表login和学生信息表student&#xff08;1&#xff09;登录注册表login&#xff08;2&#xff…

【C++】继承 | 基类和派生类对象赋值转换 | 派生类的默认成员函数 | 菱形继承

目录 1.继承的概念及定义 1.1继承的概念 1.2 继承定义 1.2.1定义格式 1.2.2继承关系和访问限定符 1.2.3继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域 4.派生类的默认成员函数 5.继承与友元 6. 继承与静态成员 7. 菱形继承 1.继承的概念…

【InsCode Stable Diffusion美图活动一期】——海边跳舞的少女

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

window平台下MSVC2015编译Libyuv静态库 动态库

window平台下MSVC2015编译Libyuv静态库 动态库 编译步骤一、环境准备1.1 下载libyuv源码1.2 下载安装cmake&#xff1a;1.3 安装MobaXterm&#xff08;终端工具&#xff09; 二、编译生成静态&#xff0c;动态库2.1 cmake编译生成Visual Studio工程2.2 使用Visual Studio打开YU…

怎么从视频中提取音频?分享三个方法给大家!

如何从视频中提取音频&#xff1f;当我们观看视频时&#xff0c;经常会听到很好听的音乐&#xff0c;或者希望下载视频课程的音频以便随时学习。有时候&#xff0c;某些音频可能没有单独的音源或无法下载。那么&#xff0c;有什么方法可以将视频中的音频提取出来呢&#xff1f;…

第五章:Mask R-CNN网络详解

(目标检测篇&#xff09;系列文章目录 第一章:R-CNN网络详解 第二章:Fast R-CNN网络详解 第三章:Faster R-CNN网络详解 第四章:SSD网络详解 第五章:Mask R-CNN网络详解 第六章:YOLO v1网络详解 第七章:YOLO v2网络详解 第八章:YOLO v3网络详解 文章目录 系列文章目录技…

Openlayers实战:自定义放大缩小,显示zoom等级

Openlayers地图中,默认的zoom组件是在左上角,这个组件很重要,方便大家来操控地图。在实际项目中,大家往往要改写这个组件,通常会放置到右下角,方便鼠标操作。 在我们的实战课程里,自定义了放大缩小,并增加了显示zoom等级的功能,实际的项目中往往都是这样办理的。 效果…

4、CCesium鼠标点击事件

在地图中添加鼠标点击事件&#xff0c;与web端cesium基本类似&#xff0c;我们使用上一个的示例&#xff0c;在上一个的示例中进行修改。 1、建一个类Handler&#xff0c;类中又个静态函数mouseUp&#xff0c;函数只在控制台输出信息 2、声明变量handler&#xff0c;并创建Scr…

java环境配置为1.8jdk为什么cmd java -version查看版本是17或者11

1、查看你的环境变量中Path的配置&#xff0c;确认%java_home%/bin在path值的第一个。 2、在cmd中输入echo %path%&#xff0c;看一下实际有效的path值是什么&#xff0c;其中的java配置对不对 3、oracle也自带一个jdk&#xff0c;如果你在配置环境变量时&#xff0c;将jdk配在…