整理一下比较常用的g++指令,现在的ide功能很强大,导致我们很难接触到底层的一些知识,比如编译的过程,你根本就不知道一段代码是怎样变成一个可执行程序的。但是想要成为一个技术大佬,这一关绕不开,早晚得学,今天整理一下。
编译的过程
以如下代码为测试用例
#include <iostream>
using namespace std;
//WDNMD
#define MAX 1000
int main()
{
for(int i = 0;i < MAX;i++)
{
cout << i << endl;
}
return 0;
}
从源代码到可执行程序需要四步:
1、预处理: 主要是代码中头文件的替换,宏定义的替换,注释的消除,结果生成.i
文件
2、编译: 将源代码转化为汇编代码,生成.s
文件
3、汇编: 将汇编代码转化为目标代码(机器代码),生成.o
文件
4、链接: 将目标代码链接起来,生成可执行程序
1、预处理
g++ -E test.cpp > test.i
这里将生成的预处理文件重定向到test.i
中,否则会直接在终端中输出预处理代码
可以查看test.i
文件,会发现注释全部消除了,头文件和宏也被替换了
2、编译
g++ -S test.cpp
上面的指令会生成test.s
文件,打开后会发现全部都是汇编代码,我现在还没有学汇编,所以只能看出来这是汇编代码,具体内容我也看不懂。
如果使用-S
参数生成test.s
文件,则必须首先生成.i
文件,否则会出错
3、汇编
g++ -c test.cpp
上面的指令会生成test.o
文件,这里面全是二进制代码,可以使用vim 打开,然后使用指令:%!xxd
转化为二进制的表示形式
4、链接
g++ -o test test.cpp
经过链接之后就会生成可执行程序,上面的是linux下的,如果是windows,应该使用
g++ -o test.exe test.cpp