【嵌入式C语言】1.gcc使用及C编译介绍

本文深入探讨了C语言的GCC编译过程,包括预处理、编译、汇编和链接四个阶段,并介绍了常见的错误类型及解决方法。通过实例展示了如何使用gcc命令行进行编译,同时讲解了预处理宏定义和条件编译的用法,适合巩固C语言基础和嵌入式C开发者阅读。
摘要由CSDN通过智能技术生成

0.前言

最近在mcu编码过程中发现,C语言基础不够扎实,本专题旨在重温夯实C语言以及顺便学习相关嵌入式C的知识。



1.gcc是什么?

  • GCC(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言译器。GNU编译器套件包括C等语言前端,也包括了这些语言的库。
  • GCC的初衷是为GNU操作系统专门编写的一款编译器。GNU系统是彻底的自由软件。此处,“自由”的含义是它尊重用户的自由。
  • gcc即翻译(编译)组织。

2.Linux终端部分相关命令

// 查看系统是否安装gcc
gcc -v
// 安装gcc
sudo apt install gcc
// 编译输出
gcc -o 输出文件名 输入文件名.c
//  切换到根目录
cd /      
//切换到根目录下的usr目录
cd /usr        
//切换到上一级目录 或者  cd ..
cd ../    
//切换到home目录   
cd ~        
//切换到上次访问的目录
cd -        
// 查看文件夹
ls
// 打开文件查看
vi 文件名带后缀
//表示保存退出
:wq
/表示强制保存退出
:wq!
//表示保存退出
:x
在vim中表示退出
:q
//表示强制不保存退出,不对文件进行保存
:q!
// 解释执行文件
./文件名
//或,执行先前编译文件
./build

3.C语言编译过程

C编译管道
C编译管道
.c文件----->预处理产生.i文件----->编译产生.s文件----->汇编产生.o文件----->链接产生. exe文件

3.1预处理

预处理去掉注释、加载头文件、替换宏定义,同时不进行语法检查。
define include不是关键字,在预处理中处理,关键字在编译中处理。

// cpp产生预处理文件,将001.c翻译输出成a.i文件
cpp -o a.i 001.c
//等价于下面指令,记下面的
gcc -E -o a.i 001.c

3.2编译

编译成汇编指令

//编译文件,将001.c编译输出成a.s文件
gcc -S -o a.s 001.c

3.3汇编

汇编成机器码

//汇编文件,将a.s编译输出成a.o文件
//.o文件,即Object File
as -o a.o a.s
//等价于下面指令,记下面的
gcc -c -o a.o a.s

3.4链接

将.o与其他文件融合生成可执行程序。完成整个编译流程,并链接加其他…内容

//(编译)链接输出
gcc -o build 001.c

4.C语言编译常见错误

4.1预处理错误

//- 头文件
//双引号一般用于自定义头文件(""不仅在系统库寻找,也在当前路径寻找)
#include "name"
//尖括号一般用于系统库头文件
#include <name>
//找不到文件
	No such file or directory
//解决方法
gcc -I跟查找文件目录
//例子
gcc -I./inc -o build 001.c abc.c
//建议以下写法
gcc -c -I./inc -o a.o 001.c
gcc -c -I./inc -o b.oabc.c
gcc -o build a.o b.o

//**常用命令**
//新建inc目录
mkdir inc
//移动文件到inc目录
mv abc.h ./inc/

4.2编译错误

语法错误,需修改文件内容

4.3链接错误

//未声明
undefined reference to 'fun'
//多出,多次实现了标签
multiple definition of ‘fun’

5.C语言预处理介绍

预处理 #

#include  包含头文件
#define    宏名   宏体//宏明大写,直接替换不计算检查,
#define ABC(x)  (5+(x))//宏函数

#ifdef
#else
#denif
//预定义宏,与编译器有关,与操作系统无关;调制中使用定位信息
_FUNCTION_		//函数名
_LINE_			//行号
_FILE_			//文件名

在这里插入图片描述
在这里插入图片描述

6.条件预处理

设置:

  • 调试版本
  • 发行版本

6.1 IDE开发

#include <stdio.h>
#define ABC 0 //1
int main()
{
#ifdef ABC
	printf("=============%s==============\n",_FILE_);
#endif
	printf("hello world!\n");
	return 0;
}

6.2 操作系统gcc编译开发

gcc -D:
gcc -DABC1 等价于#define ABC1

#include <stdio.h>
int main()
{
#ifdef ABC
	printf("=============%s==============\n",_FILE_);
#endif
	printf("hello world!\n");
	return 0;
}


// 发行版本
gcc  -O build 001.c
./build
//调试版本
gcc -DABC -O build 001.c
./build

7.宏展开下的#、##

  • 单#,加引号:
    在这里插入图片描述
  • 双#,修改前后缀:
    在这里插入图片描述
    内核中应用示例:
    在这里插入图片描述
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不僈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值