世事总是很奇秒,难道不是吗?世间,每个人都在不断改变着,也许过程坎坷不平,也许路途千回百折。不过最终好在,我们都还坚持着。
又是一年最好时光,也许应该放下思绪,整理行囊,来一次遇见自己的旅行,就像那首歌所唱的一样,“几次真的想让自己醉,让自己远离那许多恩怨是非,让隐藏已久的渴望随风飞,忘了我是谁”,但同样曲中那句“男人若没人爱,多可悲”也点明了旅途中一个人是孤独的。
不扯了,还是想一想今次染个什么颜色的头发吧:)
今天来谈一谈C++的一般编译流程(前面日志中不确定是否已提到斯最近因工作需要在研究C++)。
通常,这里只说通常,将C++源代码编译成可执行程序,需要经历4个步骤;同样是通常,编译软件我们会选择g++。
第1个步骤:预处理器(preprocessor)将头文件(.h)内容复制到源文件(.cpp)中,生成宏代码,替换通过#define定义的常量,最终生成新源文件
第2个步骤:通过编译器(compiler)将第1个步骤所生成的新源文件,编译成指定平台的汇编语言(默认文件名后缀.s)
第3个步骤:汇编器(assembler)将第2个步骤生成的汇编代码再编译成指定平台的目标代码(即机器代码,默认文件名后缀.o)
第4个步骤:链接器(linker)将第3个步骤生成的那些目标代码文件进行链接,以最终生成可执行文件(机器代码)
说的太简单,不够活泼生动形象,举个栗子。
g++编译器允许我们在上面4个步骤中任意进行中断,so,让我们来实际瞧一瞧每一步的结果。
这里推荐大家使用VS Code在Linux平台上编写C++ Program,下面开始这个经典的Hello World程序。
- 项目结构:
src目录:存放源文件
include目录:存放头文件
lib目录:存放引用的文件
Makefile文件:make命令默认的输入文件
helloworld.h: 默认构造方法、析构方法以及自定义的公共print方法
helloworld.cpp: 我们仅在print方法体中定义一段从标准输出中写入“Hello World !”的代码
main.cpp: 同其它几乎所有语言一样,main函数是整个应用程序的入口,我们在main方法体中引用helloworld - 键盘快捷键Ctrl+`,打开Terminal,键入make e,生成文件main.expanded.cpp
双击main.expanded.cpp,我们看到一个普通的源代码文件,除了它有几万行,与我们自己写的源代码没有本质区别,所以你可以看到语法智能仍然完全有效。 - 键盘快捷键Ctrl+`,打开Terminal,键入make s,生成文件main.s、helloworld.s
双击main.s,我们看到一个汇编源代码文件 - 键盘快捷键Ctrl+`,打开Terminal,键入make c,生成文件main.o、helloworld.o
双击main.o,我们看到VS Code提示无法直接打开这个文件,因为它是一个二进制文件
我们通过Extensions安装一个Hex viewer来再次打开这个二进制文件 - 键盘快捷键Ctrl+`,打开Terminal,键入make build,生成可执行文件main
我们继续在Terminal中键入main,来运行这个可执行程序,你将看到Hello World ! 被显示。
OK,就到这里。