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+....
- 等于
- 预处理:gcc -E -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。