前言:
本人14年毕业一直从事嵌入式开发,从单片机程序+电路+PCB设计+物料采购+调试焊接+批量生产+文档整理。那个心碎呀。。
言归正传,对linux一直有接触,但是一直没有整理,感觉零零散散,一点都不圆润。在此从零整理linux,也给自己梳理开发流程,总结开发过程,勿重复造轮子,时间就是金钱,效率就是生命。每项技能吸收成自己的技术,灵活应用,尽早跨过学习成长期,延长收入期。
Gcc编译4个流程:
总结如下:通俗易懂,不失章节。
预处理(Pre-Processing)、编译(Compiling)、汇编(Assembling)、链接(Linking)
hello.c
#include <stdio.h>
void main()
{
printf("wowowo");
}
第一步(预处理)
GCC –E hello.c –o hello.i
GCC将stdio.h编译进来。
第二步(编译)
GCC –S hello.i –o hello,s
GCC检查代码规范性、语法等、无误后将代码编译成汇编语言。
第三步(汇编)
GCC –c hello.s –o hello.o
GCC将汇编代码转化成二进制代码。
第四步(链接)Gcc会到系统默认路径”/usr/lib”下进行查找 ,及链接libc.so.6函数中去。
GCC hello.o –o hello
扩展语录:工作中很少每一步都逐个编译,都是一步到位,生成hello文件。
函数库:一般在使用第三方的应用的时候会涉及到函数库,比如ssh,加密等。
静态库:编译链接时,把库文件代码全部加入到可执行文件中。后缀一般为.a
动态库:编译链接时,未把库文件代码加到文件中,在程序运行时链接文件加载库。后缀.so
-I dir:
Gcc hello.c –I /root/test/ -o hello
表示在/root/test/目录下搜索头文件。
Linux中头文件默认放到“/usr/include”目录下。
Include < 123.h> :表示在标准路径中搜索头文件(注:默认为“/usr/include”,也可以将*.h所在路径添加到系统环境变量中)。
Include“123.h” :表示在本目录中优先搜索。
-Ldir
Gcc hello.c –L /root/test/lib –lsunq –o hello
表示hello.c 需要用到/root/test/lib 目录下的一个动态库libsunq.so
由于linux下的库文件命名规定:必须以 l、i、b 3个字母开头。因此在用-l选项指定链接的库文件名时可省去l、i、b 3个字母。Gcc对-lsunq处理时,自动连接名为libsunq.so的文件
“-I dir”和“-L dir”都只是指定路径,未指定文件,因此不能在路径中包含文件名。
静态库制作:
gcc –c hello.c ->得到:hello.o
ar crv libmylib.a hello.o 得到 libmylib.a
通过 ar t libmylib.a 可以查看 libmylib.a 中包含的目标文件。
总结:
1、预处理阶段
仅仅将 #include”XXX.h”中的需要文件加载进来(经过#if 0 #endif处理后加载)。
条件:C文件中必须有头文件,必须可找到头文件。可以没有库或函数实现体。(-I 找到头文件路径即可,无需指定具体.h文件)。
2、编译
无需任何外部资源,检查即可。
3、汇编
对应的g++/gcc编译; 无需其他资源。
4、链接
使用-L 指定库路径 -llibray (指定库名字)
动态库
.so动态库
.a静态库
结语: