程序生成的四个步骤,Linux动态库与静态库
#(个人课堂笔记)
●程序的四个步骤:预处理,编译,汇编,链接(面试题)
预处理:gcc –E demo.c 只进行预处理
gcc –E demo.c > demo.i 将预处理信息写入demo.i (>表示重定向的意思)
1.头文件展开把#include<stdio.h>展开进.c文件
系统存放头文件目录 根目录/user/include
#include<stdio.h> 包含的头文件搜索路径是系统的头文件目录,找不到报错
#include”stdio.h” 包含的头文件搜索路径是先在当前.c目录的下找,再到系统的头文件目录找,找不到报错(编译效率低)
2.宏替换 替换宏定义的常量#define
3.条件编译 #if #endif 可以在编译的时候把一些代码去掉,可
编译:gcc –c demo.c 生成demo.o编译文件
作用:语法检查和词法分析
汇编:gcc –S demo.c 生成demo.s汇编文件
链接:此步会对文件直接的关联进行检查。如果出错需要返回到1修改代码。直到没有错误,建立符号表,生成目标文件
●gcc 编译后生成a.out文件 这是汇编以后的语言,也就是可执行文件
●arm-linux-gcc demo.c 交叉编译代码:用arm汇编
●file a.out 显示汇编语言的属性
●自定义”add.h”用户头文件 #include”add.h”
路径不在可执行文件目录时:1. “../add.n”指定头文件路径(源程序指定头文件路径,不利于移植)
2.gcc demo.cadd.c –o demo –I/root/1109 编译时指定第三方搜索路径(大写i)(编译时指定头文件路径,有利于移植)
●gcc demo.c add.c –o demo –I/root -DMAX 在外部指定宏变量MAX(程序内不需要#define)
●Linux库文件:静态库:编译时就把库文件加入程序文件,后缀名为.a(执行速度快,代码容易部署,编译耗时,体积大,执行时占用过多内存,程序升级困难)
动态库:执行时调用库文件后缀名为.so(反之)
只能使用库文件的变量和函数,但是无法知道如何实现,例如公司售卖的产品
默认库文件目录:/lib目录与/user/lib放的都是Linux的库文件
制作静态库
1.gcc –c add.c 生成编译文件add.o
2.ar rcs libadd.a.add.o 生成libadd.a库文件
3.gcc main.c –ldemo 链接add库(先在系统的库文件搜索) 小写l
4.gcc main.c –ladd –L/root/1111 指定搜索库文件路径
5.read me 使用提示
制作动态库
1.gcc –shared –fPIC –o libadd.so add.c 动态库的创建
2.gcc main.c /root/1111/libadd.so –o add 动态库的使用