liunx gcc编译器 以及编译过程

编译过程

  1. 预处理
    (1)将所有的#define删除,并且展开所有的宏定义。说白了就是字符替换

(2)处理所有的条件编译指令,#ifdef #ifndef #endif等,就是带#的那些

(3)处理#include,将#include指向的文件插入到该行处

(4)删除所有注释
(5)头文件展开
2. 编译

编译的过程实质上是将高级语言翻译成机器语言的过程,即对a.c做了这些事:

(1)词法分析

(2)语法分析

(3)语义分析

(4)优化后生成相应的汇编代码

注:高级语言——>汇编语言——>机器语言(二进制)
3. 汇编

gcc -c hello.c -o a.o 是将源文件翻译成二进制文件,类Unix系统编译的结果生成.o文件,Windows系统生成的是.obj文件。

所以,编译过程就是讲.c文件翻译成二进制文件。

汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可。

由于a.o是机器码,不能以纯文本的形式打开(vim打开是乱码的)。

  1. 链接

就像hello.c中使用到了C标准库的东西“printf”,但是编译过程只是将源文件翻译成二进制文件而已,这个二进制文件还不能直接执行,还需要一个动作:将翻译成的二进制文件与需要用到的库绑定在一块。

gcc hello.c -o a.out 可以生成可执行程序,即gcc不带任何参数。ldd命令可以查看你的可执行程序所依赖的库。

gcc

gcc的条件编译

在这里插入图片描述
在这里插入图片描述
v1不同 输出结果不同
在这里插入图片描述

gcc 编译指令

动态库和静态库

一图看懂动静库

请添加图片描述
在liunx中,都是用动态库编译。
当然,你也可以使用静态库
-static 此选项对生成的文件采用静态链接
在这里插入图片描述在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值