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

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

时间:2024-08-10 16:18:07浏览次数:14  
标签:src gcc ++ virtual machine 源码 四步 test cmt

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$ 

参考资料来源:夏曹俊

标签:src,gcc,++,virtual,machine,源码,四步,test,cmt
From: https://www.cnblogs.com/codemagiciant/p/18352403

相关文章

  • 1.动手编写第一个makefile编译c++多文件项目
    1.动手编写第一个makefile编译c++多文件项目1.1ubuntu开发环境安装•apt-getupdate#更新安装源•apt-getinstallg++#安装gcc和c++的开发库•apt-getinstallgdb#调试工具•apt-getinstallmake•apt-getinstallopenssh-server#远程连接工具•apt-getin......
  • 2024年华为OD机试真题-推荐多样性-C++-OD统一考试(C卷D卷)
    2024年OD统一考试(D卷)完整题库:华为OD机试2024年最新题库(Python、JAVA、C++合集) 题目描述:推荐多样性需要从多个列表中选择元素,一次性要返回N屏数据(窗口数量),每屏展示K个元素(窗口大小),选择策略:1.各个列表元素需要做穿插处理,即先从第一个列表中为每屏选择一个元素,再从第二个列......
  • c++习题18-计算鞍点
    目录一,题目二,思路三,代码一,题目给定一个5×5的矩阵,每行只有一个最大值,每列只有一个最小值,寻找这个矩阵的鞍点。鞍点指的是矩阵中的一个元素,它是所在行的最大值,并且是所在列的最小值。例如:在下面的例子中(第4行第1列的元素就是鞍点,值为8)。11356912478101056......
  • c++习题20-百钱百鸡
    目录一,题目二,思路三,代码 一,题目农夫约翰今天来到了畜牧市场,想给自己的农场里买点鸡回去。已知公鸡一只5块钱,母鸡3块钱,小鸡崽子一块钱三只。农夫手里有N元,他想买N只鸡,但是他跟ljc一样数学不好,想让你帮他算一算有几种买法,以方便他挑选。输入描述一个整数N,约翰手里的钱......
  • C++ 类型转换
    目录0.前言1.C语言类型转换1.1隐式类型转换1.2显式类型转换2.C++强制类型转换2.1static_cast2.2reinterpret_cast2.3const_cast2.4dynamic_cast3.为什么C++需要4种强制类型转换3.1类型转换的多样性需求3.2提高类型转换的安全性3.3提供更明确的语义3.4支持高......
  • C++标准库函数
    很多人用C++就是因为C++有很多方便的函数,所以我来科普一下方便的输入输出函数:scanf(); 高效的输入(TLE的可以和printf一起用,很快!)格式:输入变量a:scanf(...,&a);一定要加&(取地址)...是按a的类型来定的:%d:int%lld:longlong%lf:double%c:charprintf(); ......
  • django空巢老人志愿服务系统-计算机毕业设计源码58726
    基于Python的空巢老人志愿服务系统摘 要随着社会老龄化问题日益突出,空巢老人群体的关注和关怀日益重要。本研究设计并实现了基于Python的空巢老人志愿服务系统,旨在利用技术手段提供更多关爱和支持给空巢老人群体。该系统结合Python编程语言的灵活性和易用性,实现了慈善捐赠......
  • springboot 博客交流平台-计算机毕业设计源码56406
    摘要博客交流平台作为一种重要的网络平台,为用户提供了展示自我、分享经验和与他人互动的空间。在国内外,研究者们关注博客交流平台的各个方面,并取得了显著的进展。研究内容主要包括用户体验和界面设计、社交化和互动性、多媒体内容支持、移动设备适配和跨平台体验、数据分析......
  • 微客在线客服系统 -全渠道连接一切,客服源码独立部署搭建方案
    功能介绍微客在线客服系统是一个高性能、全渠道的即时通讯解决方案,专为中小企业设计,以满足日益增长的客户服务需求。系统支持PC网站、H5网站、APP等多种平台,实现无缝的客户沟通体验。  主要功能在线客服系统:智能回复与人工接待相结合,提供多渠道整合,确保不错过任何客户对话。......
  • 【数据结构与算法】输出二叉树中从每个叶子结点到根结点的路径 C++实现(二叉树+栈+深度
    二叉树叶子节点到根节点的路径题目描述给定一棵二叉树的后序遍历序列post[s1..t1]和中序遍历序列in[s2..t2],设计一个算法,输出二叉树中从每个叶子节点到根节点的路径。请使用栈的数据结构解决。输入格式输入包括两行:第一行为后序遍历序列post[s1..t1]。第二行为中序......