【Linux工具】-gcc/g++
gcc/g++
- 一,简介
- 二,代码的翻译过程
- 1,预处理
- 2,编译
- 3,汇编
- 4,链接
- (1)静态库
- (2)动态库
- (3)动静态库比较
- 三,常见选项
一,简介
我们知道,计算机是只能识别二进制的,那么我们写的代码是怎么运行的呢?
代码是经过编译,链接,最终形成可执行程序的。
编译的过程又包括:预处理,编译,汇编,那么这些阶段都做了些什么呢?
利用gcc/g++,来介绍一下。
二,代码的翻译过程
1,预处理
gcc -E test.c -o test.i
gcc -E test.c 的意思是:从现在开始对程序进行翻译,到预处理结束后停止。
为了防止直接将预处理后的代码直接打印到屏幕上,可以加- o选项,意思是输出到指定的文件。
预处理阶段的工作
- 去注释
- 宏展开
- 头文件展开
- 条件编译
下面来验证一下:
可以看到test.c文件中 有宏的定义,条件编译,注释,包含了头文件,
预处理后文件内容的变化:
2,编译
在编译过程中,编译器会将原来的C代码转化成汇编代码,也可以使用gcc命令查看编译后的文件
gcc -S test.i -o test.s
3,汇编
汇编过程会把汇编代码转化为可重定位的二进制文件,虽然这里形成了二进制文件,但是再没有链接之前是不可被执行的。
gcc -c test.s -o test.o
看到上述场景是因为,vim是一个多模式的文本编辑器,所以它是以文本的方式对二进制文件进行解析,就呈现出上图的情况。
4,链接
链接阶段是将我们的程序链接相应的库,最终生成ELF格式的二进制文件,也就是可执行程序。
我们的程序中有许多功能是依赖于库实现的,例如:printf,scanf等功能的实现。
链接
- 静态链接
编译器的链接器此时会将我们的程序以静态链接的形式与静态库进行链接。 - 动态链接
编译器的链接器此时会将我们的程序以动态链接的形式与动态库进行连接。
使用ldd命令可以查看一个可执行程序链接了哪些动态库
ldd test
Linux下:动态库是以.so结尾的,静态库是以.a结尾的。
Windows下:动态库是以.dll结尾的,静态库是以.lib结尾的。
(1)静态库
程序与静态库链接时,是把自己写的程序中用到库中的某项功能的代码直接拷贝到自己的程序中。
一旦链接成功,那么即使静态库出现问题,也不会影响程序的运行,但是同样也增加了程序的大小。
(2)动态库
程序与动态库进行链接的时候,是把自己写的程序中用到库中某项功能代码的地址拷贝到自己程序的相应位置,在程序运行时,再去库中实现这一功能。
因此,动态库也被称作共享库。
(3)动静态库比较
- 动态库是专门让编译器对用户的程序进行动态链接的,静态库是专门让编译器对用户的程序进行静态链接的。
- 动态链接是将动态库中的代码的地址,拷贝到用户程序的相应位置,静态链接是将静态库中的代码直接拷贝到用户程序中。
- 静态链接成功后,就不在依赖库,可以自己独立运行。
- 动态链接成功后,程序还是依赖于库,一旦动态库缺失,程序就无法运行。
- 静态链接由于直接拷贝代码,比较浪费空间
- 动态链接由于大家都共享动态库,所以比较省空间。
- Linux环境下,默认链接时,是动态链接。
静态链接
gcc test.c -o test-static -static
可以看到动态链接与静态链接形成的可执行文件的大小差距还是很大的。
Centos7安装C/C++静态库的方法
- C: sudo yum install -y glibc-static
- C++:sudo yum install -y libstdc++ -static
三,常见选项
-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
-S 编译到汇编语言不进行汇编和链接
-c 编译到目标代码
-o 文件输出到 文件
-static 此选项对生成的文件采用静态链接
-g 生成调试信息。GNU 调试器可利用该信息。
-shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
-O0
-O1
-O2
-O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-w 不生成任何警告信息。
-Wall 生成所有警告信息。
【Linux工具】-gcc/g++相关推荐
- 采用 linux+eclipse+gcc g++ 来弄C 的多线程编程
---------------------------------------- ================ 对于 C项目的 多线程编程 放弃 windows+mingw+eclipse 采用 ...
- Linux系统安装gcc/g++详细过程
下载: http://ftp.gnu.org/gnu/gcc/gcc-4.5.1/gcc-4.5.1.tar.bz2 浏览: http://ftp.gnu.org/gnu/gcc/gcc-4.5.1/ ...
- Linux下gcc/g++、make和cmake的区别
文本程序到可执行文件生成无论在什么平台大致分为以下几个部分: 1.用编辑器编写源代码,如.c文件. 2.用编译器编译代码生成目标文件,如.o. 3.用链接器连接目标代码生成可执行文件,如.exe ...
- 【Linux】gcc/g++
目录 一.概念 二.语法 三.动/静态库 四.关于文件名后缀问题 一.概念 gcc/g++是linux系统中的编译器,是一款软件.该软件只负责编译,与Windows下的vs系列的差别就是:vs系列是一 ...
- Linux编译器-gcc/g++的使用
★★★★★ 是小夏啊! 我们知道,当我们用像VS等这样的编译器写完代码后,会通过快捷键操作或是编译器上相应的选项来编译运行,紧接着我们一般通过控制面板来观察程序运行的结果,从而判断自己写的程序代码是否 ...
- 【Linux】gcc/g++、gdb的使用
文章目录 一.前言 二.gcc的基本使用 1. 预处理 2. 编译 3. 汇编 4. 链接 三.函数库 四.gcc常用选项总结 五.gdb的使用 1. 背景知识 2. 基本使用 一.前言 在学习本文前 ...
- Linux下gcc/g++编译器gdb调试器和makefile的使用
文章目录 一.gcc的使用 gcc选项 二.gdb的使用 三.Linux项目自动化构建工具-make/Makefile 3.1 概念 3.2 使用 3.3 原理 一.gcc的使用 首先我们知道一个C/ ...
- 【Linux】Linux中gcc/g++的使用
本期主题:程序的编译过程和gcc/g++的使用 博客主页: 小峰同学 分享小编的在Linux中学习到的知识和遇到的问题 小编的能力有限,出现错误希望大家不吝赐
- 【Linux】gcc/g++区别和联系
gcc/g++是什么 gcc/g++之间的区别和联系 gcc/g++是什么 讲到gcc/g++,那就得先说一下GCC,GCC:GNU Compiler Collection(GUN 编译器集合),它可 ...
- Linux下 gcc/g++ 版本切换与CMake各版本安装
一. gcc/g++ 版本切换 首先下载需要的版本(以gcc8为例) sudo apt-get install gcc-8 删除原有的gcc链接, 改为新链接 cd /usr/bin sudo rm ...
最新文章
- java中最常用jar包的用途说明,适合初学者
- verilog中=和=的区别
- mysql存储过程加多个创建表_mysql 存储过程创建多个表
- Matlab实用程序--图形应用-图形标注
- 后台开发技术--接入层设计
- 让程序员不再苦逼的四大神器
- Arduino学习笔记36
- Java黑皮书课后题第5章:**5.7(金融应用:计算将来的学费)假设今年某大学的大学为10000美元,学费的年增长率为5%,一年后,学费将是10500美元。编写程序,计算10年后的学费,10~13费
- Session id的存储
- Ansys节点数据批量一键导出脚本生成CSV (ansys数据导出利用matlab脚本)
- 能力共进、价值共赢,华为传媒携手生态伙伴推动行业数字化转型和智慧化升级
- 从“谈芯”走向“用芯” RISC-V 未来前景光明?
- element ui 前台模板_element-ui 菜单模板封装(递归)
- php对接抖音快手小红书短视频去水印接口的代码
- 禾多科技与RTI达成合作,加速自动驾驶在中国量产落地
- 故障解决:发生系统错误 67 找不到网络名
- outlook签名文件编辑_如何在Microsoft Outlook中创建,编辑和应用签名
- Win11如何清除最近打开过的文件记录?
- C#实现qq邮箱发送邮件(验证码)
- .NET Core 2.2 IIS网站出现HTTP503无法访问解决方法
热门文章
- 设计师一定能用上的6个,免费、可商用图片素材网站
- GeForce MX150相对应的NVIDIA CUDA版本_七彩虹ProMaster A1设计师电脑评测:RTX 3080加持 生产力大提升|七彩虹|gpu|nvidia|amd|英特尔|显卡...
- systeminfo卡死一例分析
- folly库安装(2)openssl升级、python3.8安装
- op07数据手册分析
- C语言#判断今天是工作日还是休息日
- excel去除重复项
- 谷歌浏览器chrome devtools 插件安装
- java.sql.SQLException: Unable to run insert stmt on object 解决办法
- vs 2022连接MySQL数据库