自学内容网 自学内容网

基础IO:动静态库

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        //查看执行程序的链接的库的属性

命令: file test          //直接查看test汇编文件是动态链接还是静态链接;

1.7动静态库本质就是一个文件,库有自己的命名规则:libname.soxxxx;

lib     name    .so         xxxx;
前缀  库名称   动静态   版本号   //只要看中间名称就可以

 1.8静态链接

gcc test.c -o test -l库名 -static  //-static告诉gcc我要静态链接;
//Linux中,如果按照静态链接的方式,进行可执行程序,要添加-static选项--提供静态库

1.9安装静态库 

//如果用户想使用静态库

yum install glibc-static  //安装c语言静态库

yum install libstdc++-static  //安装c++语言静态库

2.静态库

gcc -c add.c -o add.o        //生成二进制汇编文件
gcc -c sub.c -o sub.o
ar -rc libmymath.a add.o sub.o        //生成静态库libmymath.a
ar归档工具,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         //重新加载一下配置文件即可

 注:最常用的就是第一种;简单粗暴;


原文地址:https://blog.csdn.net/qincjun/article/details/142634106

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!