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

372 0
Honkers 2025-4-6 04:28:36 | 显示全部楼层 |阅读模式

0.前言

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



1.gcc是什么?

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

2.Linux终端部分相关命令

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

3.C语言编译过程


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

3.1预处理

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

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

3.2编译

编译成汇编指令

  1. //编译文件,将001.c编译输出成a.s文件
  2. gcc -S -o a.s 001.c
复制代码

3.3汇编

汇编成机器码

  1. //汇编文件,将a.s编译输出成a.o文件
  2. //.o文件,即Object File
  3. as -o a.o a.s
  4. //等价于下面指令,记下面的
  5. gcc -c -o a.o a.s
复制代码

3.4链接

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

  1. //(编译)链接输出
  2. gcc -o build 001.c
复制代码

4.C语言编译常见错误

4.1预处理错误

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

  1. //**常用命令**
  2. //新建inc目录
  3. mkdir inc
  4. //移动文件到inc目录
  5. mv abc.h ./inc/
复制代码

4.2编译错误

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

4.3链接错误

  1. //未声明
  2. undefined reference to 'fun'
  3. //多出,多次实现了标签
  4. multiple definition of ‘fun’
复制代码

5.C语言预处理介绍

预处理 #

  1. #include 包含头文件
  2. #define 宏名 宏体//宏明大写,直接替换不计算检查,
  3. #define ABC(x) (5+(x))//宏函数
  4. #ifdef
  5. #else
  6. #denif
复制代码
  1. //预定义宏,与编译器有关,与操作系统无关;调制中使用定位信息
  2. _FUNCTION_ //函数名
  3. _LINE_ //行号
  4. _FILE_ //文件名
复制代码


6.条件预处理

设置:

  • 调试版本
  • 发行版本

6.1 IDE开发

  1. #include <stdio.h>
  2. #define ABC 0 //1
  3. int main()
  4. {
  5. #ifdef ABC
  6. printf("=============%s==============\n",_FILE_);
  7. #endif
  8. printf("hello world!\n");
  9. return 0;
  10. }
复制代码

6.2 操作系统gcc编译开发

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

  1. #include <stdio.h>
  2. int main()
  3. {
  4. #ifdef ABC
  5. printf("=============%s==============\n",_FILE_);
  6. #endif
  7. printf("hello world!\n");
  8. return 0;
  9. }
  10. // 发行版本
  11. gcc -O build 001.c
  12. ./build
  13. //调试版本
  14. gcc -DABC -O build 001.c
  15. ./build
复制代码

7.宏展开下的#、##

  • 单#,加引号:
  • 双#,修改前后缀:

    内核中应用示例:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Honkers

荣誉红客

关注
  • 4010
    主题
  • 36
    粉丝
  • 0
    关注
这家伙很懒,什么都没留下!

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行