1.铺垫
1.1 静态库的后缀是 .a;
1.2 动态库的后缀是 .so;
1.3在创建动静态库时,必须依照以下方式命名lib库名.后缀;lib表示是一个库,后缀表示是动态还是静态;举例:libhello.a
1.4库的默认搜索路径为:
1、当前程序运行的目录
2、环境变量
3、系统默认的目录 /usr/include/(头文件所在目录)、/lib64/(库文件所在目录)
1.5静态库是将文件拷贝到目标文件中,动态库是被加载到内存中共享使用的;
1.6补充:命令:objdump -S a.out //将可执行程序(二进制程序)反汇编出来
举例: 静态库 libhello.a 动态库 libhello.so
lib:library图书馆的前3个字母;
命令:ldd a.out //查看执行程序的链接的库的属性
2.静态库
gcc -c add.c -o add.o //生成二进制汇编文件gcc -c sub.c -o sub.oar -rc libmymath.a add.o sub.o //生成静态库libmymath.aar是归档工具,ar命令:用来打包、压缩和管理可执行文件和库的实用程序rc(replace and create替换并创造):如果存在静态库libmymath.a,那就替换,如果不存在此静态库那就创造一个ar -tv libmymath.a //查看静态库中的目录列表—静态库是由那几个文件组成;t:列出静态库中的文件v:verbose 详细信息
链接静态库的方法
gcc main.c -i 头文件名称 -I 头文件所在目录/ -L 静态库所在目录 -l静态库名称
-i:指定头文件名称,(一般不使用,绝对用不上,在c文件中就写了)
-I(大i): include,头文件所在路径,绝对路径或相对路径都可以
-L:library,静态库所在目录,绝对路径或相对路径都可以
-l(小L):link,需要链接的静态库名,-l后没有空格,直接跟静态库名称
静态库名称必须去lib、去后缀,是真实的库名称
举例
gcc main.c -I ./lib/include/ -L ./lib/mymathlib/ -lmymath
// ./lib/include/,最后一个/可以省略
gcc main.c -I include1/ -I include2/ -L mymathlib1/ -L mymathlib2/ -lmymath
-lmymath2 //一次执行多个库
必须要告诉编译器,头文件目录在哪?、静态库目录在哪?,以及要链接的静态库名称
优化:库的安装
//每一次都这样写,太麻烦了;可以把文件都放在默认系统路径下,或当前目录下
举例:
cp ./mymath.h /usr/include/ //头文件放到系统默认头文件目录下
cp ./libmymath.a /lib64/ //静态库放到系统默认库目录下
gcc main.c -lmymath
优化:软连接
ln -s 【目录+目标文件名或目录,最好采用绝对路径】 【连接名】ln:link 建立链接-s(symbolic):象征的,符号的o举例:ln -s /home/qk/lib/include /usr/include/myinc //给头文件所在路径建立软连接并放在系统默认路径下#include"myinc/mymath.h"ln -s /home/qk/lib/include/libmymath.a /lib64/libmymath.a //给静态库所在路径建立软连接并放在系统默认路径下gcc main.c -lmath
3.动态库
gcc -fPIC -c 要被生成.o文件的名称
-fPIC(position independent code) 产生位置无关码
举例:
gcc -fPIC -c mylog.c //生成mylog.o;
gcc -fPIC -c myprint.c
gcc -shared -o libmethod.so *.o //形成动态库
-shared:形成动态库
-o:输出的动态库的名称
*.o:把所有的.o文件,形成动态库
举例:
gcc -shared -o libmethod.so *.o
gcc main.c -I 头文件所在目录 -L 库文件所在目录 -lmymethod -lmymath //一次包含多个数据库 编译链接动态库
运行程序时;程序加载到内存中,系统也必须要知道动态库在哪里
1.数据库文件到系统默认路径下;/lib64下或/usr/lib64/下
2.建立数据库软连接到系统默认路径下;/lib64下或/usr/lib64/下建立软连接
3.将自己所在的库路径,添加到系统环境变量LD_LIBRARY_PATH中(一次性的,重启就被改变;也可以添加到脚本里
命令:echo $LD_LIBRARY_PATH //查看用户自定义的动态库路径的;
命令:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:要添加的环境变量(绝对文件路径)
//将自己的环境变量添加到自定义环境变量中
$LD_LIBRARY_PATH:必须要加此语句,否则会把以前的环境变量覆盖掉
举例:.
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/qk/...
4.在/etc/ld.so.conf.d目录下,建立自己的动态库路径的配置文件,然后重新ldconfig即可
让他跟系统中的库一样,随便就能用到
conf(config):配置/ 配置文件
.d(directory):目录
ls /etc/ld.so.conf.d/ //查看该目录下的文件,该目录下的文件都是.conf,建一个.conf文件,里面放动态库路径就行;
touch mylib.conf //在给路径下创建一个.conf文件,名字随便起,后缀不可变;
vim mylib.conf //打开此文件,并在该文件里写上动态库的绝对路径后保存并推出
命令:ldconfig //重新加载一下配置文件即可
注:最常用的就是第一种;简单粗暴;