【Linux】gcc/g++

news2024/11/19 6:41:43

目录

Linux编译器-gcc/g++使用

No.1 背景知识

No.2 预处理(进行宏替换)

No.3 编译(生成汇编)

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

No.5 动态链接过程

No.6 gcc选项


Linux编译器-gcc/g++使用

No.1 背景知识

  • 预处理(进行宏替换)

  • 编译(生成汇编)

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

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

由这4中编译方式:我们测试一段代码看一下,是否可以得到我们想要的结果。

 

No.2 预处理(进行宏替换)

// 预处理
[ShaXiang@VM-8-14-centos ~]$ gcc -E Test.c -o Test.i
// -E: 从现在开始,进行程序的编译,当你将预处理完后,就停下来。
// -o:指名形成的临时文件名称.(后缀为.i)文件

 

No.3 编译(生成汇编)

// 编译 - 翻译成汇编语言
[ShaXiang@VM-8-14-centos ~]$ gcc -S Test.c -o Test.s
// -S:从现在开始,进行程序的翻译为汇编,做完翻译工作,就停下来,不要继续往下走了。
// -o:指名形成的临时文件名称.(后缀为.s)文件

 

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

// 将汇编编程二进制目标文件
[ShaXiang@VM-8-14-centos ~]$ gcc -c Test.s -o Test.o
// -c:从在在开始,程序进行翻译,昨晚汇编工作,编程可重定向目标二进制,就停下来。
// -o:指名形成的临时文件名称.(后缀为.o)文件
// 可以使用[ShaXiang@VM-8-14-centos ~]$ od Test.o 查看二进制代码
0000000 042577 043114 000402 000001 000000 000000 000000 000000
0000020 000001 000076 000001 000000 000000 000000 000000 000000
0000040 000000 000000 000000 000000 001630 000000 000000 000000
0000060 000000 000000 000100 000000 000000 000100 000015 000014
0000100 044125 162611 000277 000000 164000 000000 000000 000277

// 链接 - 将你写的代码和c标准库中的代码合起来
[ShaXiang@VM-8-14-centos ~]$ gcc Test.o // 连接为可执行程序。
[ShaXiang@VM-8-14-centos ~]$ gcc Test.o -o myTest  // 可以指定为执行文件名称。

 

No.5 动态链接过程

// 我们可以查看可执行程序的动态链接和静态链接
// 指令一:
        file (可执行程序文件名)
// 指令二:
        ldd  (可执行程序文件名)
// 解释: .so为动态库   .a为静态库

 

生成静态可执行程序

// 第一步:先安装一下静态库,如果有的话就忽略
sudo yum install -y glibc-static
sudo yum install -y libstdc++-static    // 安装c++的库
// 第二部生成静态库的可执行文件。
gcc Test.c  -o myTest_s -static

在这里涉及到一个重要的概念:函数库

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

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

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

  • 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”

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

  • gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证

No.6 gcc选项

  • -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面

  • -S 编译到汇编语言不进行汇编和链接

  • -c 编译到目标代码

  • -o 文件输出到 文件

  • -static 此选项对生成的文件采用静态链接

  • -g 生成调试信息。GNU 调试器可利用该信息。

  • -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.

  • -O0

  • -O1

  • -O2

  • -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高

  • -w 不生成任何警告信息。

  • -Wall 生成所有警告信息。

gcc选项记忆

  • esc,iso例子

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

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

相关文章

什么是Serverless?

Serverless 无服务器;无主机; Serverless ,按中文翻译,称为「无服务器」。被认为是新一代的云计算发展方向。 在某些场景可以解读为一种软件系统架构方法,通常称为 Serverless 架构 关于 Serverless 的定义&#xf…

留学Assignment写作怎么注意论证方法?

Assignment的论证方法,对于一篇Assignment而言,学会如何论证,对Assignment的逻辑和内容,有一定的作用。掌握常用的论证方法,了解Assignment要求,在Assignment写作的过程中,学会加以应用&#xf…

VMware 安装、移除Ubuntu系统

目录 前言 安装虚拟机 1. 新建虚拟机 2. 进入向导 3. 选择系统镜像 4. 添加系统设置&#xff0c;用户名主机名密码 <实际没啥用...在系统安装过程中才设置的> 5. 设置虚拟机名称&#xff0c;存放位置 6. 磁盘容量 7. 设置虚拟机硬件配置 8. 自定义硬件 9. 开机…

如何实现jwt鉴权机制?

一、是什么 JWT&#xff08;JSON Web Token&#xff09;&#xff0c;本质就是一个字符串书写规范&#xff0c;如下图&#xff0c;作用是用来在用户和服务器之间传递安全可靠的信息 在目前前后端分离的开发过程中&#xff0c;使用token鉴权机制用于身份验证是最常见的方案&…

Unity 发布安卓包的配置

unity版本是&#xff1a;unity5.6.7&#xff0c;主要是我现在工作中只会在一些工业软件中会用到3d部分&#xff0c;所以版本低了一些&#xff0c;感觉低版本打开unity的速度反而更快一些。发布这个帖子主要目的是 Android SDK 可选项太多了&#xff0c;不熟悉的话&#xff0c;根…

数据技术篇之数据同步

第3章 数据同步 1.数据同步基础 直连同步 &#xff08;1&#xff09;什么是直连同步&#xff1f;直连同步是指通过定义好的规范接口 API 和基于动态链接库的方式直接连接业务库&#xff0c;如 ODBC/JDBC 等规定了统 一规范的标准接口&#xff0c;不同的数据库基于这套标准接口…

gnulib源码安装

接上文《autoconf-archive源码安装》&#xff0c; 链接如下&#xff1a; autoconf-archive源码安装_蓝天居士的博客-CSDN博客 上篇文章在构建autoconf-archive的时候&#xff0c;第一步引导构建就出现了错误&#xff0c;如下所示&#xff1a; $ ./bootstrap.sh ./bootstrap…

SSM+Mysql实现的大学校园兼职系统(功能包含注册登录,发布兼职、个人中心、论坛交流、系统公告、查看兼职信息、查看用户信息、私聊等)

博客目录SSMMysql实现的大学校园兼职系统实现功能截图系统功能使用技术代码完整源码SSMMysql实现的大学校园兼职系统 本系统是一个在线的大学校园兼职系统&#xff0c;商家可以在上面发布自己的兼职&#xff0c;学生可以根据自己的需要&#xff0c;联系兼职&#xff0c;给学生…

JavaScript 中如何实现并发控制?

一、并发控制简介 在日常开发过程中&#xff0c;你可能会遇到并发控制的场景&#xff0c;比如控制请求并发数。那么在 JavaScript 中如何实现并发控制呢&#xff1f;在回答这个问题之前&#xff0c;我们来简单介绍一下并发控制。 假设有 6 个待办任务要执行&#xff0c;而我们…

Kubernetes HPA 动态弹性扩缩容

1.HPA 1.1HPA介绍 1.在Kubernetes中&#xff0c;HPA自动更新工作负载资源&#xff08;例如&#xff1a;Deployment或者StatefulSet&#xff09;&#xff0c;目的是自动扩缩工作负载以满足需求&#xff0c;水平扩缩意味着对增加的负载的响应是部署更多的 Pod&#xff0c;与垂直…

算法工程师深度解构ChatGPT技术

引言 | 本栏目特邀腾讯知名语言文本项目算法工程师冉昱、薛晨&#xff0c;用专业视野带你由浅入深了解ChatGPT技术全貌。它经历了什么训练过程&#xff1f;成功关键技术是什么&#xff1f;将如何带动行业的变革&#xff1f;开发者如何借鉴ChatGPT思路和技术&#xff0c;投入到日…

西门子PLC S7-1500产生精确时间戳及各种数据处理的方法

目录 1、完整程序 2、将时钟转换成整型数 3、获取相对时间 4、转成微秒&#xff08;μs&#xff09;&#xff0c;并转成32位无符号整数 5、翻转的问题 6、有时间戳采集时的对时机制 在数据采集时&#xff0c;精准的相对时间是非常重要的。尤其是高速采集时&#xff0c;上位…

算法训练第四十五天 | LeetCode 70、322、279背包问题

LeetCode 70爬楼梯 题目简析&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 思路分析&#xff1a; 用完全背包的思路来做&#xff0c;见注释 //普通dppublic int climbStairs(in…

Redis框架(四):大众点评项目 基于Redis的短信登录

大众点评项目 基于Session的短信登录需求&#xff1a;基于Redis实现短信验证登录基于Redis的短信登录实战优化为Redis login方法配置拦截器实现双重验证配置类实现异步/排序 拦截结果展示SpringCloud章节复习已经过去&#xff0c;新的章节Redis开始了&#xff0c;这个章节中将会…

【图像处理】DWT图像处理【含Matlab源码 198期】

⛄一、数字图像处理简介 图像处理基础教程链接 1 【基础教程】基于matlab图像处理&#xff08;表示方法数据结构基本格式类型转换读取点运算代数运算&#xff09;【含Matlab源码 834期】 2 【基础教程】基于matlab图像处理&#xff08;读写显示运算转换变换增强滤波分析统计&a…

jvm学习笔记(一)----jvm简史

文章目录1. JVM简单介绍2. java虚拟机介绍1. JVM简单介绍 虚拟机是一种抽象化的计算机&#xff0c;通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构&#xff0c;如处理器、堆栈、寄存器等&#xff0c;还具有相应的指令系统。Java虚拟机屏…

ASP.NET微信快速开发框架源码【源码分享】

ASP.NET微信快速开发框架源码 微信公众平台快速开发框架源码 需要源码学习&#xff0c;查看文末卡片获取&#xff0c;或私信我。 框架主要技术&#xff1a; ASP.NET MVC5、ASP.NET Identity、Bootstrap、KnockoutJs、Entity Framework等。 主要特色&#xff1a; 1、快速迭代开…

Redis主从复制原理

前面的文章中我们演示过Redis主从配置的操作&#xff0c;可以查看之前的博文Redis主从配置教程。这篇文章主要介绍一下Redis主从复制的工作过程和原理。 Redis复制工作过程 Redis复制的工作过程如上图&#xff0c;主要包含以及几个阶段&#xff1a; 1. 设置IP端口并建立连接 …

C++学习笔记(十九)——stack和queue的模拟实现

容器适配器 deque的简单介绍 stack的模拟实现 queue的模拟实现 容器适配器 适配器:一种设计模式,该种模式是将一个类的接口转换成客户希望的另外一个接口. stack和queue的底层结构 可以看出的是,这两个容器 相比我们之间见过的容器多了一个模板参数,也就是容器类的模板参数,…

数据结构复习+答案

一、选择题&#xff1a;&#xff08;每小题2分&#xff0c;共30分&#xff09; 1、在数据的逻辑结构中&#xff0c;树结构和图结构都是&#xff08; &#xff09; A.非线性结构 B.线性结构 C.动态结构 D.静态结构 2.在一个长度为n的顺序表中插入一个元素的算法的时间复杂度为&…