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文件----->预处理产生.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.宏展开下的#、##
- 单#,加引号:
- 双#,修改前后缀:
内核中应用示例: