库的介绍
静态库和动态库都是ELF格式的文件,通过编译得来的
普通程序是被./运行
库是被执行但是不能被运行不能./也没有main函数
执行:可以中途来回加载到内存
库是用来存放有价值的函数接口
静态库:.a
特点:调用函数库的程序源码要和库文件一起编译,导致程序文件偏大,平台转移的时候直接烧写即可
制作方式:
第一步:使用gcc生成.o文件
gcc -c goal.c -o goal.o
第二步:使用ar编译器生成.a静态库
ar -cr -o face.a face.o
-o:目标文件
c:创建一个空的库
r:把模块加入到库中
使用方式:
gcc -o file file.c libgoal.a
动态库:.so
** 特点 :调用函数库的程序源码只需指定链接库即可,在转移平台的时候需要城区连同库一起烧写过去**
制作方式:
第一步:使用gcc生成.o文件
gcc -fPIC -c goal.c -o goal.o
-fPIC:使生成的代码和内存无法访问
第二步:使用gcc生成.so文件
gcc -share goal.o -o libgoal.so (不是真正意义共享)
-fPIC
没有-fPIC:
有固定地址去加载运行对应的库代码(决对地址),–>重定位<代码段和数据段会被改> --> 把库源码重新copy一份(多个副本),违背了全共享。
有-fPIC:
使用动态库,链接:告诉编译器你的库在哪里?你的库叫什么?:
gcc sb.c -o sb -lgoal -L./
-l:告诉编译库的名字(小写的L)
-L:告诉编译器库的路径
-I:指定头文件的路径(大写的i)
命令:ldd sb
重点注意:在运行需要动态库的程序的时候,需要特别注意:你的库有没有放在系统的环境变量/lib里面
linux文件存放路径
/etc:专门存放系统的配置文件
/lib:专门存放系统的动态库文件
/mnt: 专门用来文件系统挂载
/home:系统的家目录(里面都是用户名字的文件)
/dev:专门存放系统的设备文件