C++ —— C++程序编译的四个过程

C++ —— C++程序编译的四个过程

 

       g++是Linux下C++的编译器;我为什么会选择Linux下的g++编译器,就是因为g++可以看到程序从编译到运行的过程做了些什么。而VS等集成开发环境看不到这些,并不是说VS工具不好,(VS还是相当好用的...)。对于学习来说,需要知道程序从编译到运行进行了哪些工作,做了哪些事情,首推g++编译器(这个看个人习惯)。

一、常见文件后缀

       .c为后缀的文件:c语言源代码文件

       .a为后缀的文件:是由目标文件构成的库文件

       .C,.cc为后缀的文件:是c++源代码文件

       .h为后缀的文件:头文件

       o为后缀的文件:是编译后的目标文件

       .s为后缀的文件:是汇编语言源代码文件

       .m为后缀的文件:Objective-C原始程序

       .so为后缀的文件:编译后的动态库文件

 

二、g++执行的四个过程

1、预处理:条件编译,头文件包含,宏替换的处理,生成.i文件。

2、编译:将预处理后的文件转换成汇编语言,生成.s文件

3、汇编:汇编变为目标代码(机器代码)生成.o的文件

4、链接:连接目标代码,生成可执行程序

 

三、最简单的C++程序——"helloworld!\n"

// 新建hello.cpp文件,vim编辑
#include <iostream>
using namespace std;int main(void)
{count << "hello world!"<< endl;reutrn 0;
}

1)预处理阶段

g++ -E hello.cpp > hello.i

       通过vim打开hello.i文件,你会发现一些情况(最好是自己观察,看看哪些内容被换了);

       宏的替换,还有注释的消除,还有找到相关的库文件,将#include文件的全部内容插入。若用<>括起文件则在系统的INCLUDE目录中寻找文件,若用""括起文件则在当前目录中寻找文件。

       用编辑器打开hello.i会发现有很多很多代码,你只需要看最后部分就会发现,预处理做了宏的替换,还有注释的消除,可以理解为无关代码的清除。

2)编译

g++ -S hello.cpp

       生成hello.s文件,.s文件表示是汇编文件,用编辑器打开就都是汇编指令。(可以通过vim编辑器看看hello.s里面的内容【都是汇编指令,哈哈】)。

3)汇编

g++ -c hello.cpp

       汇编变为目标代码(机器代码)生成.o的文件,.o是gcc生成的目标文件,用编辑器打开就都是二进制机器码。

4)链接 ——链接生成可执行文件(库文件进行链接)

g++ -o hello hello.cpp

程序运行:./hello【输出hello world!】

 

         在成功编译之后,就进入了链接阶段。在这里涉及到一个重要的概念:函数库(可以这么理解就是不带main()函数的.cpp生成的)。

       可以重新查看这个小程序,在这个程序中并没有定义”cout”的函数(准确说cout不是函数,cout却很独特:既不是函数,似乎也不是C++特别规定出来的像if,for一类有特殊语法的“语句”,其实说到底还是函数调用,不过这函数有些特殊,用的是运算符重载,确切地说是重载了“<<”运算符。这里如果用pritf()函数说明会更好,暂且当做函数理解吧)实现,且在预编译中包含进的”iostream”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实现”cout”函数的呢?系统把这些函数实现都被做到名为stdc++的库文件中去了,在没有特别指定时,g++会到系统默认的搜索路径”/usr/lib”下进行查找,也就是链接到stdc++库函数中去,这样就能实现函数”cout”了,而这也就是链接的作用。

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

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

相关文章

屏下指纹介绍

一、光学指纹问题现状光学指纹当前随着成本的下降&#xff0c;各大厂商都在低中高端旗舰用上了光学指纹。有别于传统的电容指纹&#xff0c;光学指纹在解锁性能上目前都进行了优化&#xff0c;性能接近电容指纹。二、光学指纹电容指纹原理两者原理都是对指纹的纹路脊谷进行信号…

关于 SAP 访问关键字的说明

SAP 为了保护标准程序和字典对象&#xff0c;对于标准代码的修改都设定了访问关键字控制&#xff0c;用户需要修改时必须输入正确的访问关键字才可以编辑标准程序和字典对象&#xff0c;这个关键字可以到 SAP 网站上申请。 地址为 http://service.sap.com&#xff0c;用你公司的…

ABAP Netweaver和Hybris里获得内存使用统计数据

ABAP Netweaver 事物码ST06 Hybris 每隔5秒钟&#xff0c;Hybris Administration console会发起一个到Java后台的AJAX查询请求&#xff1a; 这个5秒的时间间隔定义在project.properties配置文件里&#xff0c; 然后使用JavaScript的setInterval建立定期轮询&#xff1a; Java后…

Linux中常用C/C++一些头文件的作用

<assert.h>&#xff1a;ANSI C。提供断言&#xff0c;assert(表达式) <glib.h>&#xff1a;GCC。GTK&#xff0c;GNOME的基础库&#xff0c;提供很多有用的函数&#xff0c;如有数据结构操作函数。使用glib只需要包含<glib.h> <dirent.h>&#xff1a;G…

CRecordset类

CRecordset类 https://blog.csdn.net/elcoteq983/article/details/7000745 CRecordset::Open virtual BOOL Open( UINT nOpenType AFX_DB_USE_DEFAULT_TYPE, LPCTSTR lpszSQL NULL, DWORD dwOptions none ); nOpenType 接受默认值AFX_DB_USE_DEFAULT_TYPE&#xff0…

STM32做平衡小车,代码,PCB都现成的,妈妈再也不用担心我的毕业设计了

▌一、硬件介绍主控芯片用的是100脚的STM32F103VET6&#xff0c;陀螺仪用的是MPU6050&#xff0c;电机驱动用的是TB6612&#xff0c;蓝牙是汇承的HC05邮票孔封装的&#xff0c;WIFI用的是济南有人科技的USR-WIFI232-S&#xff0c;小车底盘用的是平衡小车之家的某一款带编码器的…

Apache 配置:是否显示文件列表

Apache 配置&#xff1a;是否显示文件列表 进入虚拟主机配置文件 显示文件列表的话 options Indexes FollowSymLinks 不显示文件列表的话 options FollowSymLinks 文章来源&#xff1a;刘俊涛的博客 地址&#xff1a;http://www.cnblogs.com/lovebing 欢迎关注&#xff0c;有问…

升级到virtualbox-2.1.4

今天把virtualbox从1.6.6升级到2.1.4.启动系统时出现VERR_SUPDRV_COMPONENT_NOT_FOUND网上查了一下&#xff0c;桥接需要vboxnetfltmodprobe vboxnetflt后就可以了然后把vboxnetflt加入到/etc/config.d/modules里使每次系统启动都载入vboxnetflt遗憾的是&#xff0c;这次升级并…

C++ —— C++引用

C引用 一、普通引用 【变量名】 变量名实质上是一段连续存储空间的别名&#xff0c;是一个标号 程序中通过变量来申请并命名内存空间 通过变量的名字可以使用存储空间 问题1&#xff1a;对一段连续的内存空间只能取一个别名吗&#xff1f;【不是】 1、引用是C的概念 // …

微信越滑越卡

这篇文章是我的朋友小二哥写的&#xff0c;他解决了一个问题并提交了一个补丁给google合入&#xff0c;当然了&#xff0c;这也是他第一次提交补丁被google采纳。我觉得这才是做技术的样子&#xff0c;二哥也很喜欢篮球&#xff0c;&#xff0c;为二哥吹一波。哈哈。关于这次补…

MFC中五个初始类的作用

MFC中五个初始类的作用 https://blog.csdn.net/thisispan/article/details/7393401

扁平化可伸展导航

<!DOCTYPE html> <html> <head><meta charset"utf-8"><title>扁平化可伸展导航[原创]</title><link rel"stylesheet" type"text/css" href"nav.css"><link rel"stylesheet" t…

重新整理了下mount/umount,免得老是不来新机忘记了

挂接就是将分离的文件系统附加到文件系统分成结构中。文件系统要附加到某个挂接点&#xff0c;也就是目录。 挂接和卸载文件系统发生在系统启动和关闭时。 系统启动时&#xff0c;将读取/etc/vfstab文件。这个文件记录系统要挂接的文件系统。因此/etc/vfstab文件中的文件系统…

C++ —— C++内联函数

C内联函数 一、内联函数 1、C中的const常量可以替代宏常数定义&#xff0c;如&#xff1a; const int A 3; #define A 3 C中是否有解决方案替代宏代码片段呢&#xff1f;&#xff08;替代宏代码片段就可以避免宏的副作用&#xff01;&#xff09; 2、C中推荐使用内联函数…

大佬为何可以把单片机描述得如此形象生动?

某年某日某产房&#xff0c;你诞生了&#xff08;power up , 上电运行&#xff09;&#xff0c;结果你不哭&#xff0c;医生把你提起来&#xff0c;屁股上狠狠一巴掌&#xff0c;你哇哇大哭&#xff08;reset, 复位成功&#xff09;&#xff0c;护士给你检查&#xff0c;看有没…

CWinThread

https://baike.baidu.com/item/CWinThread/5902501 https://blog.51cto.com/5412097/1643861 https://blog.csdn.net/thanklife/article/details/78677688 CWinThread&#xff1a;&#xff1a;SuspendThread https://blog.csdn.net/h315444352/article/details/22091361 工作者…

html总结:文本框填满表格

<style> input { width: 100%; }</style>转载于:https://www.cnblogs.com/iCheny/p/8798808.html

双硬盘奇怪问题...

今天下午打开文件夹....提示错误....指定的文件夹无法打开....汗...文件夹大小变成0KB..而有的文件夹又是正常的...可以打开,可以访问....一切正常...但是就是那么几个文件夹.里面放的东西比较的多....打不开...由于本人是双硬盘.上次出现了RAW 的错误...让我有一种一朝被蛇咬,…

51单片机温度控制系统报警器,不会做课程设计的就拿走

▌功能说明&#xff08;1&#xff09;单片机读取温度传感器当前的温度值并在LCD液晶显示屏上的第一行显示当前的温度值&#xff0c;如Temp&#xff1a;27.5℃。&#xff08;2&#xff09;单片机读取按键状态并通过人为手动按键部分来设置最低温度到最高温度的温度范围后&#x…

C++ —— C++数据类型

C—— C数据类型 1、数据类型分类 &#xff08;1&#xff09;基本数据类型 字符型&#xff08;char&#xff09;—— 1字节 整型&#xff08;int&#xff09; —— 4字节 浮点型&#xff08;实型&#xff09;—— 单精度float4字节&#xff1b;双精度&#xff08;double&a…