C++编译过程

文章目录

  • [1 预处理](#1 预处理)
  • [2 编译阶段](#2 编译阶段)
  • [3 汇编阶段](#3 汇编阶段)
  • [4 链接阶段](#4 链接阶段)
c 复制代码
#define N 10

// 这是一个加法函数
int add(int a, int b){
    return a+b;
}

int main(){
    int a = 10;
    int b = 20;
    int c = add(a, b);
    int d = N;
    return 0;
}

1 预处理

shell 复制代码
g++ -E main.cpp -o main.i

作用:

1 去掉注释

2 与处理指令替换

3 头文件替换

生成 a.i

c 复制代码
int add(int a, int b){
    return a+b;
}

int main(){
    int a = 10;
    int b = 20;
    int c = add(a, b);
    int d = 10;
    return 0;
}

2 编译阶段

shell 复制代码
g++ -S main.i -o main.s

作用:

1 翻译成汇编语言

2 检查代码报错

生成 a.s

c 复制代码
	.file	"a.c"
	.text
	.globl	add
	.def	add;	.scl	2;	.type	32;	.endef
	.seh_proc	add
add:
	pushq	%rbp
	.seh_pushreg	%rbp
	movq	%rsp, %rbp
	.seh_setframe	%rbp, 0
	.seh_endprologue
	movl	%ecx, 16(%rbp)
	movl	%edx, 24(%rbp)
	movl	16(%rbp), %edx
	movl	24(%rbp), %eax
	addl	%edx, %eax
	popq	%rbp
	ret
	.seh_endproc
	.def	__main;	.scl	2;	.type	32;	.endef
	.globl	main
	.def	main;	.scl	2;	.type	32;	.endef
	.seh_proc	main
main:
	pushq	%rbp
	.seh_pushreg	%rbp
	movq	%rsp, %rbp
	.seh_setframe	%rbp, 0
	subq	$48, %rsp
	.seh_stackalloc	48
	.seh_endprologue
	call	__main
	movl	$10, -4(%rbp)
	movl	$20, -8(%rbp)
	movl	-8(%rbp), %edx
	movl	-4(%rbp), %eax
	movl	%eax, %ecx
	call	add
	movl	%eax, -12(%rbp)
	movl	$10, -16(%rbp)
	movl	$0, %eax
	addq	$48, %rsp
	popq	%rbp
	ret
	.seh_endproc
	.ident	"GCC: (x86_64-win32-seh-rev0, Built by MinGW-W64 project) 8.1.0"

3 汇编阶段

shell 复制代码
g++ -c main.s -o main.o

作用:

将.s 文件,汇编成二进制文件

4 链接阶段

shell 复制代码
g++ main.o -o main

作用:

将目标文件.o 和库文件链接,生成可执行文件

相关推荐
瀚高PG实验室2 分钟前
HGDB集群(安全版)repmgr手动切换主备库
java·数据库·安全·瀚高数据库
eqwaak012 分钟前
动态图表导出与视频生成:精通Matplotlib Animation与FFmpeg
开发语言·python·ffmpeg·音视频·matplotlib
刘新明198913 分钟前
Frida辅助分析OLLVM虚假控制流程(下)
java·开发语言·前端
澄澈i17 分钟前
CMake学习篇[3]---CMake进阶+嵌套CMakeLists+多层级关系
c++·学习·cmake
第二只羽毛35 分钟前
重载和继承的实践
java·开发语言
王嘉俊92540 分钟前
设计模式--适配器模式:优雅解决接口不兼容问题
java·设计模式·适配器模式
王嘉俊92542 分钟前
设计模式--组合模式:统一处理树形结构的优雅设计
java·设计模式·组合模式
道19931 小时前
50 台小型无人车与50套穿戴终端 5 公里范围内通信组网方案深度研究
java·后端·struts
迎風吹頭髮1 小时前
UNIX下C语言编程与实践35-UNIX 守护进程编写:后台执行、脱离终端、清除掩码与信号处理
java·c语言·unix
杨小码不BUG1 小时前
蛇形舞动:矩阵填充的艺术与算法(洛谷P5731)
c++·算法·矩阵·csp-j/s·循环控制