C语言编译流程

来源:互联网 发布:手机版淘宝怎么改评价 编辑:程序博客网 时间:2024/05/16 12:12

  • 1编译流程图示
  • 2编译各阶段命令
    • 2-1预处理阶段
    • 2-2 编译阶段
    • 2-3 汇编阶段
    • 2-4 链接阶段
  • 3例子

1、编译流程图示

我们在Linux环境下编译单个C文件时,最简单的方法是输入一条命令gcc hello.c就可以生成默认的可执行文件a.out,展开该命令可以看到实际流程如下。
(编译命令参数请看 gcc使用手册 )

这里写图片描述

预处理阶段 -> 编译阶段 -> 汇编阶段 -> 链接阶段

2、编译各阶段命令

  • 预处理阶段
  • 编译阶段
  • 汇编阶段
  • 链接阶段

2-1预处理阶段

把.c文件预处理命令替换为对应的头文件内容,并合并成.i文件中。

gcc -E -o hello.i hello.c

预处理阶段主要处理下面四件事:

  • 将头文件内容包含进.c源文件中;
  • 删除注释;
  • 宏替换;
  • 条件编译;

2-2 编译阶段

把源文件编译成汇编语言,并生成.s文件。

gcc -S -o hello.s hello.i// orgcc -S -o hello.s hello.c

2-3 汇编阶段

把源文件汇编成机器语言,并生成.o目标文件。

gcc -o hello.o -c hello.s// orgcc -o hello.o -c hello.igcc -o hello.o -c hello.c

2-4 链接阶段

把源文件链接成可执行文件(Linux下的文件名后缀是随便可取的,只是文件里的内容格式不变而已)。

gcc -o hello hello.o// orgcc -o hello hello.sgcc -o hello hello.igcc -o hello hello.cgcc hello.c

3、例子

wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ lsmymathfun.c  mymath.h  mymath_test.cwu_being@UbuntuKylin1704:~/Code/C/test_cpp$ cat -n mymath_test.c      1  #include <stdio.h>     2  #include "mymath.h"     3       4  int main()     5  {     6      printf("My Pi: %lf\n", my_pi());     7      return 0;     8  }     9  wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ gcc mymath_test.c /tmp/ccRCzDfw.o:在函数‘main’中:mymath_test.c:(.text+0x5):对‘my_pi’未定义的引用collect2: error: ld returned 1 exit statuswu_being@UbuntuKylin1704:~/Code/C/test_cpp$ gcc mymath_test.c mymathfun.c wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ ./a.out My Pi: 3.141593wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ vim mymath_test.c wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ cat -n mymath_test.c      1  #include <stdio.h>     2  #include "mymath.h"     3  #include "mymathfun.c"     4       5  int main()     6  {     7      printf("My Pi: %lf\n", my_pi());     8      return 0;     9  }    10  wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ gcc mymath_test.c wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ ./a.out My Pi: 3.141593wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ gcc mymath_test.c mymathfun.c /tmp/ccMnE10S.o:在函数‘my_pi’中:mymathfun.c:(.text+0x0): `my_pi'被多次定义/tmp/cc89I2rk.o:mymath_test.c:(.text+0x0):第一次在此定义collect2: error: ld returned 1 exit statuswu_being@UbuntuKylin1704:~/Code/C/test_cpp$ 

Wu_Being博客声明:本人博客欢迎转载,请标明博客原文和原链接!谢谢!
《C语言编译流程》: http://blog.csdn.net/u014134180/article/details/78329908

Wu_Being 吴兵博客接受赞助费二维码

如果你看完这篇博文,觉得对你有帮助,并且愿意付赞助费,那么我会更有动力写下去。

原创粉丝点击