0%

嵌入式学习笔记

GCC相关指令

  • gcc -o 输出文件名 输入文件名.c
    • 输入文件名可以在-o前或输入文件名后,但不可以直接跟在-o后。
  • gcc -v -o 输出文件名 输入文件名
    • 查看gcc翻译官详细信息。
  • C语言编译过程
    • 预处理:gcc -E -o
      • 等于cpp -o 输出文件名.i 输入文件名.c
      • #define#include在预处理阶段被翻译。
    • 编译:gcc -S -o
      • 等于/usr/lib/gcc/i486-linux-gnu/4.4.3/cc1 -o 输出文件名.s 输入文件名.i
      • 编译的时候已经没有#define#include,主要编译关键字和运算符。
    • 编译->汇编:gcc -c -o
      • 等于/usr/lib/gcc/i486-linux-gnu/4.4.3/as -o 输出文件名.o 输入文件名.s
    • 编译->汇编->链接: gcc -o 输出文件名 输入文件名.c
      • 等于/usr/lib/gcc/i486-linux-gnu/4.4.3/collect2 -o 输出文件名 输入文件名.o+....

C语言常见错误

  • 预处理错误:#include出错,找不到指定头文件。
    • #include "name"双引号一般指自定义的头文件,在当前目录下寻找“name”头文件。
    • #include <name>尖括号一般指系统库的头文件,在系统的环境变量中寻找“name”头文件。
    • 解决方法之一:gcc -I./查找头文件的目录 -o 输出文件名 输入文件名.c
  • 编译错误
    • 语法错误
  • 链接错误
    • undefined reference to 'fun'指原材料不够,即没有关于fun函数的足够的内容。解决:查看标签是否实现;链接时是否将相关文件加入一起链接。
    • multiple definition of 'fun'存在多个fun函数的定义。解决:只保留一个标签的实现。

预处理的使用

  • #include包含头文件

  • #define 宏名 宏体宏体对宏名进行替换,但是不进行语法检查(注意)!

    • 宏体加括号更安全,例如:#define ABC (5+3)
    • 宏函数:```#define ABC(x) (5+(x))
  • 条件编译:#ifdef#else#endif

  • 预定义宏:系统已经定义好的。方便在调试中使用。

    • __FUNCTION__:函数名,%s
    • __FILE__:文件名,%s
    • __LINE__:行号,%d