编译过程参数
1,其本质就是一个编译器。
gcc -o output
gcc -o 输出文件名 输入文件名
2.其编译过程实质可分为一下四部:
类型 | 说明 |
-E | 预处理后即停止,不进行编译、汇编及连接 |
-S | 编译后即停止,不进行汇编及连接 |
-c | 编译或汇编源文件,但不进行连接 |
-o file | 指定输出文件file |
(1)预处理 【gcc -E】可以理解为替换,宏定义等,生成.i文件。
(2)编译 (编译为汇编)【gcc -S】 生成.s文件 (处理关键字)
(3) 汇编 【gcc -c】 由上步.s生成.o文件
(4) 链接 【gcc -o】
上述四部只能依次顺序进行(下一步奏的执行,上一步骤必须执行)。
在预处理阶段,主要处理C语言源文件中的#ifdef、#include、以及#define等命令。在与处理过程中,GCC会忽略掉不需要预处理的输入文件,该阶段会生成中间文件*.i。
3.常见错误
(1)预处理出错
#include “stdio.h” (“”优先从当前目录开始,一般适用于自定义头文件)
#include "abc.h" (<>从系统目录中查找 , 一般是 :/usr / inlcude)
not find
gcc -I 跟查找头文件的目录(指明头文件所在)eg: gcc -I ./a -o file a.c
(2)编译错误
主要为语法问题;
4.预处理的使用
#include 包含有文件
#define 宏定义 (替换)
#define 宏名 宏体 (宏体最好加括号);不进行语法检查
常见系统预定义宏
__FUNCTION__ 函数名
__LINE__ 行号
__FILE__ 文件名
条件预处理
#ifdef
#else
#endif ;
命令 : gcc -D :(相当于在命令是人为加入预处理条件)
gcc -DABC1 === #define ABC1
***************************************************************************
宏展开下的#,## (内核中使用较多)
# 字符串化
## 链接字符
#define ABC(x) #x
#define DAY(x) myday##x
********************************************************************
库
.a[libname.a] 静态链接库
.so [libname.so] 动态链接库
-static | 静态编译 |
-shared(默认) |
1,生成动态库文件 2,进行动态编译 |
-L dir | 库文件搜索中添加路径 |
-fPID | 生成使用相对位置无关的目标代码,然后常用于使用gcc的-static选项从该PIC目标文件生成动态库文件 |