gcc或者g++编译的几个过程
一段普通的 c++ 代码是如何变成可执行程序的
using namespace std;
int main() {
cout << "hello, world" << endl;
return 0;
}
会经过4个步骤
- 预处理
- 编译
- 汇编
- 链接
gcc或者g++编译的几个过程
作用:宏替换(展开文本,include 文本替换),删除空格等文本处理
相关语句 -E 仅生成 .i 预处理后的文件

编译
-S 仅生成 .s 编译后 .s 后缀文件
将c代码解析后生成汇编语句
下面代码是一部分汇编语句
ubuntu@foo:~/test$ cat test.s
.arch armv8-a
.file "test.c"
.text
.section .rodata
.align 3
.type _ZStL19piecewise_construct, %object
.size _ZStL19piecewise_construct, 1
_ZStL19piecewise_construct:
.zero 1
.local _ZStL8__ioinit
.comm _ZStL8__ioinit,1,8
.align 3
.LC0:
.string "hello, world"
.text
.align 2
.global main
.type main, %function
main:
.LFB1521:
.cfi_startproc
stp x29, x30, [sp, -16]!
.cfi_def_cfa_offset 16
.cfi_offset 29, -16
.cfi_offset 30, -8
mov x29, sp
adrp x0, .LC0
add x1, x0, :lo12:.LC0
adrp x0, :got:_ZSt4cout
ldr x0, [x0, #:got_lo12:_ZSt4cout]
bl _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
mov x2, x0
adrp x0, :got:_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
汇编
将汇编语句转换成 机器码 (二进制)
-c 仅生成汇编后的 .o 后缀文件

链接
将静态链接库与动态链接库链接到程序中
生成的可执行文件中会多很多信息

总结
经过4个步骤处理之后,最终就可以执行了

OK,精通 hello world