【嵌入式C语言补强】学习日志(一)

GCC概述

————翻译官、翻译组织
gcc -o 输出的文件名 输入的文件名
示例:
  • 通过vi建立一个新文件【test.c】并编写代码
    • 注意:GCC会根据不同文件后缀来调用具体的编译程序
vi test.c
————编写代码
#include <stdio.h>
int main()
{
    printf("Hello World!\n");
    return 0;
}
补充:在Linux系统中,返回值为0代表成功,一切不为0的返回值都是失败
  • 使用GCC编译代码并运行
gcc -o Hello test.c
————将test.c文件编译并生成名为Hello的文件(不需要有后缀名)
此时使用【ls】命令可以看到不仅有test.c文件,还有编译生成的Hello文件
./Hello
————通过【./】命令使shell程序在当前目录下寻找文件,使其具备执行能力以进行代码的解释执行
得到输出: Hello World!
以上示例可知:通过【gcc -o】可以直接调用gcc进行翻译服务
但还需要更深层次地了解GCC这个翻译组织有哪些成员为此进行了服务
  • 查看gcc完整翻译过程
命令:gcc -v
此处查看刚刚示例程序的完整翻译过程
gcc -v -o Hello test.c
得到:
 
  • 版本信息
 
  • GCC调用的第一个翻译命令(编译)
 
  • GCC调用的第二个翻译命令(汇编)
 
  • GCC调用的第三个翻译命令(链接)
 
引入:
原理上,GCC并不是简单的通过调用【gcc -o】就可以完成翻译,其内部有着许多翻译官(命令)来帮助工作

C语言编译过程介绍

之前用【gcc -v】简单看了gcc的翻译过程,本节具体研究这些工具集起了什么作用,怎么由【test.c】一步步生成【Hello】可执行文件

预处理

(不一定有)——宏定义,文件包含include……
cpp -o test.i test.c
输入为【.c】文件,输出得到【.i】文件
等效于命令【gcc -E】
//可以跳过该命令直接到编译及之后过程
示例:
修改test.c文件,新增宏定义
 
打开预处理之后生成的【test.i】文件
 
在文件的最后一行可以看到宏定义去除并已在程序中替换
 

编译

  • /usr/lib/gcc/x86_64-linux-gnu/11/cc1(编译器)实际上也算是一个命令
  • 输入为【.c】文件,输出得到【.s】文件
  • 等效于命令【gcc -S】
简化这个工具集可以得到以下示例:
调用命令—— gcc -S -o test.s test.c
目的——看看使用这个命令能输出什么
 
可以看到 命令【gcc -S】 将【test.c】文件编译成了【test.s】文件
并且【test.s】文件可以看出是汇编语言(X86)
//之后还会接触到ARM汇编语言
总结:/usr/lib/gcc/x86_64-linux-gnu/11/cc1 命令【gcc -S】的实际作用——将【.c】文件编译成【.s】文件

汇编 

  • as实际上也算是一个命令,输入是刚刚编译生成的【.s】文件,输出得到【.o】文件
  • 等效于命令【gcc -c】
注意:使用 命令【gcc -c】可以直接将【.c】文件生成【.o】文件(包括编译生成【.s】文件的过程)
简化这个工具集可以得到以下示例:
调用命令—— gcc -c -o test.o test.s
目的——看看使用这个命令能输出什么
 
可以看到 命令【gcc -c】 将【test.s】文件汇编成了二进制【test.o】文件
总结: 命令【gcc -c】的实际作用——将【.s】文件汇编成【.o】文件

链接 

  • /usr/lib/gcc/x86_64-linux-gnu/11/collect2(链接器)实际上也算是一个命令
  • 输入是刚刚汇编生成的【.o】文件,输出得到【可执行】文件
  • 等效于命令【gcc -o】
注意:使用 命令【gcc -o】可以直接将【.c】文件生成【可执行】文件(包括编译生成【.s】文件和汇编生成【.o】文件的过程)
简化这个工具集可以得到以下示例:
调用命令—— gcc -o Test test.o
目的——看看使用这个命令能输出什么
 
可以看到 命令【gcc -o】 将【test.o】文件汇编成了可执行【Test】文件
总结: 命令【gcc -c】的实际作用——将【.o】文件汇编成可执行文件
//也可以直接将【.c】文件生成可执行文件(跳过了编译生成【.s】文件和汇编生成【.o】文件的过程)

总结流程:预处理【.i】——编译【.s】——汇编【.o】——链接【可执行】

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值