C语言编译流程

1、编译流程图示

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

这里写图片描述

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

2、编译各阶段命令

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

2-1预处理阶段

把.c文件预处理命令替换为对应的头文件内容,并合并成.i文件中。(有兴趣可以用命令cat hello.i 查看一下)

gcc -E -o hello.i hello.c

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

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

2-2 编译阶段

把源文件编译成汇编语言,并生成.s文件。(有兴趣可以用命令cat hello.s 查看一下)

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

2-3 汇编阶段

把源文件汇编成机器语言,并生成.o目标文件。(有兴趣可以用命令cat hello.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下的文件名后缀是随便可取的,只是文件里的内容格式不变而已)。(有兴趣可以用命令objdump -d hello 查看一下汇编代码)

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

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值