C程序编译步骤

C代码编译成可执行程序经过4步:

  1. 预处理:宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除,这里并不会检查语法
  2. 编译:检查语法,将预处理后文件编译生成汇编文件
  3. 汇编:将汇编文件生成目标文件(二进制文件)
  4. 链接:C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去

4. C语言编译过程_开发语言

VS 执行结果一闪而过的解决方法:

  1. system("pause");
  2. 项目->属性->配置属性->链接器->系统->子系统->控制台 增加“/SUBSYSTEM:CONSOLE”链接选项即可

gcc 编译过程

1. 分步编译

预处理:gcc -E introduce.c -o introduce.i

编 译:gcc -S introduce.i -o introduce.s

汇 编:gcc -c introduce.s -o introduce.o

链 接:gcc introduce.o -o introduce

选项

含义

-E

只进行预处理

-S(大写)

只进行预处理和编译

-c(小写)

只进行预处理、编译和汇编

-o file

指定生成的输出文件名为 file

文件后缀

含义

.c

C 语言文件

.i

预处理后的 C 语言文件

.s

编译后的汇编文件

.o

编译后的目标文件

编译的时候最后两倒数第二步的时候用了大写C

gcc -C introduce.s -o introduce.o

gcc introduce.o -o introduce

导致了如下问题, 记录一下

/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/Scrt1.o: in function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status

正确的编译过程

gcc -E introduce.c -o introduce.i
gcc -S introduce.i -o introduce.s
gcc -c introduce.s -o introduce.o
gcc introduce.o -o introduce
./introduce

4. C语言编译过程_c语言_02

2. 一步编译

gcc introduce.c -o introduce1 // 自动完成:预处理、编译、汇编、链接的过程

4. C语言编译过程_c语言_03

查找程序所依赖的动态库

Windows平台下,需要相应软件(Depends.exe):

工具下载地址:http://www.dependencywalker.com/

4. C语言编译过程_c语言_04


4. C语言编译过程_编译过程_05