C语言编译流程

简介: 1编译流程图示2编译各阶段命令2-1预处理阶段2-2 编译阶段2-3 汇编阶段2-4 链接阶段3例子1、编译流程图示我们在Linux环境下编译单个C文件时,最简单的方法是输入一条命令gcc hello.c就可以生成默认的可执行文件a.out,展开该命令可以看到实际流程如下。

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
// or
gcc -S -o hello.s hello.c

2-3 汇编阶段

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

gcc -o hello.o -c hello.s
// or
gcc -o hello.o -c hello.i
gcc -o hello.o -c hello.c

2-4 链接阶段

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

gcc -o hello hello.o
// or
gcc -o hello hello.s
gcc -o hello hello.i
gcc -o hello hello.c
gcc hello.c

3、例子

wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ 
wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ ls
mymathfun.c  mymath.h  mymath_test.c
wu_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 status
wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ gcc mymath_test.c mymathfun.c 
wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ ./a.out 
My Pi: 3.141593
wu_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.141593
wu_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 status
wu_being@UbuntuKylin1704:~/Code/C/test_cpp$ 

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

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

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

目录
相关文章
|
1月前
|
存储 自然语言处理 编译器
C语言从入门到实战——编译和链接
在C语言中,编译和链接是将源代码转换为可执行文件的两个主要步骤。 编译过程包括以下步骤: 1. 预处理:将源代码中的预处理指令(如`#include`和`#define`)替换为实际的代码。 2. 编译:将预处理后的代码转换为汇编语言。 3. 汇编:将汇编语言转换为机器码指令。 链接过程包括以下步骤: 1. 目标文件生成:将每个源文件编译后生成的目标文件(`.o`或`.obj`)进行合并,生成一个总的目标文件。 2. 符号解析:查找并解析目标文件中的所有符号(例如全局变量和函数名),以确保每个符号都有一个唯一的地址。 3. 地址重定位:根据符号表中符号的地址信息,将目标文件中的所有地址引用
42 0
|
1月前
|
机器学习/深度学习 人工智能 算法
21.C语言:if语句编译选择结构举例
21.C语言:if语句编译选择结构举例
13 0
|
16天前
|
存储 自然语言处理 编译器
编译和链接---C语言
编译和链接---C语言
|
1月前
|
存储 机器学习/深度学习 自然语言处理
【进阶C语言】编译与链接、预处理符号详解
【进阶C语言】编译与链接、预处理符号详解
25 0
|
1月前
|
编译器 Linux C语言
程序环境和预处理(含C语言程序的编译+链接)--2
程序环境和预处理(含C语言程序的编译+链接)--2
30 5
|
1月前
|
存储 编译器 程序员
程序环境和预处理(含C语言程序的编译+链接)--1
程序环境和预处理(含C语言程序的编译+链接)--1
25 0
|
2月前
|
C语言
C语言多文件编译、结构体、枚举及联合
C语言多文件编译、结构体、枚举及联合
20 0
|
2月前
|
移动开发 C语言
C语言控制流程
C语言控制流程
9 0
|
3月前
|
编译器 Linux vr&ar
C语言静态编译和动态编译
C语言静态编译和动态编译
75 0
|
3月前
|
存储 C语言
深入浅出 C 语言:学变量、掌控流程、玩指针,全方位掌握 C 编程技能
C 语言介绍 C 语言的特性 C 语言相对于其他语言的优势 C 程序的编译 C 中的 Hello World 程序
48 2