程序如何生成和运行
- 一、生成可执行文件
- 1、 源文件
- 2、 预处理:`g++ -E hello.cpp -o hello.i` //将头文件,宏定义等替换到源文件
- 3、 编译:`g++ -S hello.i -o hello.s` // 生成汇编代码
- 4、 汇编:`g++ -c hello.s -o hello.o` // 生成二进制目标代码
- 5、 链接:`g++ hello.o -o hello` // 生成可执行文件
- 二、运行可执行程序
一、生成可执行文件
生成可执行程序要经过以下几步:预处理——编译——汇编——链接
。
预处理:
g++ -E test.cpp -o test.i
编译:g++ -S hello.i -o hello.s
汇编:g++ -c hello.s -o hello.o
链接:g++ hello.o -o hello
// 常用操作:
g++ -c hello.cpp -o hello.o
g++ hello.o -o hello
g++ hello.cpp -o hello
./hello
1、 源文件
// hello.h void foo() { int c = 0; int d = 1; } // hello.cpp #include "hello.h" int main() { int a = 0; int b = a; foo(); return 0; }
2、 预处理:g++ -E hello.cpp -o hello.i
//将头文件,宏定义等替换到源文件
// hello.i # 0 "hello.cpp" # 0 "<built-in>" # 0 "<command-line>" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 0 "<command-line>" 2 # 1 "hello.cpp" # 1 "hello.h" 1 void foo() { int c = 0; int d = 1; } # 2 "hello.cpp" 2 int main() { int a = 0; int b = a; foo(); return 0; }
3、 编译:g++ -S hello.i -o hello.s
// 生成汇编代码
// hello.s部分代码 main: .LFB1: .cfi_startproc endbr64 pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 subq $16, %rsp movl $0, -8(%rbp) movl -8(%rbp), %eax movl %eax, -4(%rbp) call _Z3foov movl $0, %eax leave .cfi_def_cfa 7, 8 ret .cfi_endproc
4、 汇编:g++ -c hello.s -o hello.o
// 生成二进制目标代码
// hello.o部分代码
5、 链接:g++ hello.o -o hello
// 生成可执行文件
二、运行可执行程序
可执行程序是存储在磁盘中,当我们运行程序时,可执行程序将加载到内存
中,然后有一个进程
在运行该代码,进程运行在进程的虚拟内存空间,下面是虚拟内存空间的基本分布。
参考
bilibili-Jonases-c++