编译过程参数

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目标文件生成动态库文件
posted on 2018-10-06 19:21  ._初一  阅读(403)  评论(0编辑  收藏  举报