2.g++分步编译演示从源码到执行程序的四步

news/2024/11/16 7:56:14/文章来源:https://www.cnblogs.com/codemagiciant/p/18352403

2.g++分步编译演示从源码到执行程序的四步

2.1 gcc的工作流程

gcc编译器将c源文件到生成一个可执行程序,中间一共经历了四个步骤:

四个步骤并不是gcc独立完成的,而是在内部调用了其他工具,从而完成了整个工作流程,其中编译最耗时,因为要逐行检查语法。

gcc的工作流程:
1.预处理: cpp预处理器,去掉注释,展开头文件,宏替换
gcc -E test.c -o test.i
2.编译: gcc,将源代码文件编译成汇编语言代码
gcc -S test.i -o test.s
3.汇编: as, 将汇编语言代码编译成了二进制文件(目标代码)
gcc -c test.s -o test.o
4.链接: ld, 链接test.c代码中调用的库函数
gcc -o test test.o

一步生成最终的可执行程序:

gcc test.c -o test

2.2 gcc常用参数

▶-v 查看gcc版本号, --version也可以

▶ -E 生成预处理文件

▶ -S 生成汇编文件

-c 只编译,生成.o文件, 通常称为目标文件

-I 指定头文件所在的路径

-L 指定库文件所在的路径

-l 指定库的名字

-o 指定生成的目标文件的名字

-g 包含调试信息,使用gdb调试需要添加-g参数

▶ -On n=0∼3 编译优化,n越大优化得越多

test_gcc.cpp

#include <iostream>
using namespace std;int main(int argc, char* argv[])
{cout << "test g++" << endl;return 0;
}

(1)预处理

cmt@cmt-virtual-machine:~/src/test_gcc$ vi test_gcc.cpp
cmt@cmt-virtual-machine:~/src/test_gcc$ g++ -E test_gcc.cpp
cmt@cmt-virtual-machine:~/src/test_gcc$ g++ -E test_gcc.cpp>test.ii //重定向方便看

(2)编译

cmt@cmt-virtual-machine:~/src/test_gcc$ g++ -S test.ii
cmt@cmt-virtual-machine:~/src/test_gcc$ ls
test_gcc.cpp  test.ii  test.s

(3)汇编

cmt@cmt-virtual-machine:~/src/test_gcc$ g++ -c test.s
cmt@cmt-virtual-machine:~/src/test_gcc$ ls
test_gcc.cpp  test.ii  test.o  test.s
cmt@cmt-virtual-machine:~/src/test_gcc$ ls -l
总用量 680
-rw-rw-r-- 1 cmt cmt    119 8月   7 21:30 test_gcc.cpp
-rw-rw-r-- 1 cmt cmt 681708 8月   7 21:34 test.ii
-rw-rw-r-- 1 cmt cmt   2944 8月   7 21:39 test.o
-rw-rw-r-- 1 cmt cmt   2360 8月   7 21:36 test.s
cmt@cmt-virtual-machine:~/src/test_gcc$ 

(4)链接

cmt@cmt-virtual-machine:~/src/test_gcc$ g++ test.o -o test
cmt@cmt-virtual-machine:~/src/test_gcc$ ./test
test g++
cmt@cmt-virtual-machine:~/src/test_gcc$ 

参考资料来源:夏曹俊

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.makefile运行流程分析并使用变量改写项目

3.makefile运行流程分析并使用变量改写项目GNU make用来构建和管理自己的工程 Makefile 文件描述了整个工程的编译、连接等规则3.1makefile变量的使用命令格式 含义CXX C++编译器的名称,默认值为g++CXXFLAGS C++编译器的选项,无默认值$* 不包含扩展名的目标文件名称$+ 所有的…

Epson L4168 固件升级

我的Epson L4168打印机提示固件升级,我手贱就点了OK。过一会再来看,发现打印机直接黑屏 显示EPSON PRINTER Recovery Mode,一看就知道升级失败变砖了。按任何键都没有反应。中文官网上没有这款打印机的recovery mode修复帮助。我就搜索一下其它国家的官网上发现L4168在北美地…

costmap代价地图

1 什么是costmap代价地图在机器人进行路径规划时,我们需要明白规划算法是依靠什么在地图上来计算出来一条路径的。依靠的是gmapping扫描构建的一张环境全局地图,但是仅仅依靠一张原始的全局地图是不行的。因为这张地图是静态的,无法随时来更新地图上的障碍物信息。在现实环境…

店铺点评_1_短信登录功能

1 短信登录 1.1 导入点评项目框架 1. 当前模型简述手机/app端发起请求,请求nginx服务器。(nginx基于七层模型走HTTP协议,可以实现基于Lua直接绕开tomcat访问redis;也可以作为静态资源服务器,实现上万并发,负责均衡到下游tomcat服务器,打散流量。一台4核8G的tomcat,在优…

sql优化小tips

sql优化小tips基础sql优化1、避免使用select * 尽量要什么字段查什么字段, select * 多查出来的数据在网络上IO传输的过程中,会增加数据传输的是的时间。且 select *不会走覆盖索引,会出现大量的回表操作,而从导致查询sql的性能很低。 ​ 覆盖索引(Covering Index): 覆盖…

一些面试小tips

反射 它赋予了我们在运行时分析类以及执行类中方法的能力。通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。 反射可以让代码更加灵活、(为各种框架提供开箱即用的功能提供了便利),一般我们写业务代码接触到直接使用反射机制的场景不多,但是在…

暑假集训CSP提高模拟17

暑假集训CSP提高模拟17 组题人: @joke3579\(T1\) P222. 符号化方法初探 \(70pts\)原题: [ABC081D] Non-decreasing部分分测试点 \(1\) :输出样例 \(1\) 。 测试点 \(11 \sim 15\) :由于 \(\{ a \}\) 非负,所以对 \(\{ a \}\) 作前缀和即可。 随机 \(pts\) :乱搞。正解当 …

一款.NET开发的AI无损放大工具

前言 今天大姚给大家分享一款由.NET开源(GPL-3.0 license)、基于腾讯ARC Lab提供的Real-ESRGAN模型开发的AI无损放大工具:AI-Lossless-Zoomer。Real-ESRGAN模型专注于人像和动漫图片的高质量无损放大。项目功能 支持多线程处理、批量图片处理、设置选项、自定义输出格式和自…

Java知识点1

Java知识点 什么是字节码?采用字节码的好处是什么? 在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。字节码…

Python-快速语法参考-全-

Python 快速语法参考(全)原文:The Python Quick Syntax Reference 协议:CC BY-NC-SA 4.0零、简介 Python 提供的最好的东西之一是一个广泛的标准库,它提供了广泛的包含特性,从网络功能、数据库处理和 XML 处理一直到 zip 文件处理。有数百个额外的库扩展了 Python 的能力…

最小斯坦纳树(动态规划求解+原创讲解细节)

最小斯坦纳树给定点的“最小生成树”问题。背景 给定无向连通图 \(G=(V,E)\),给出包含 \(k\) 个结点的点集 \(S\),包含点集 \(S\) 的连通图被称作 斯坦纳树。但我们关注的是如何求出包含点集 \(S\) 的最小连通图 \(G=(V,E)\) 即 最小斯坦纳树。其中\(S\subseteq V,E\subseteq…

Convert类型转换

static void Main(string[] args){//Convert转换:不同数据类型之间的转换;//大前提: 面儿上一定要过得去Console.WriteLine("请输入你的姓名:");string strName = Console.ReadLine();Console.WriteLine("请输入你的数学成绩:");double douMath = Convert.…