【静态库、动态库的制作】

库的基础知识:
1.库是一个二进制文件,库中都是一些编译好的代码,用来实现某些特定的功能,这些代码可以被程序调用。库中包含的都是一些可以让程序调用的函数。
2.系统默认安装的库的路径:/lib; /usr/lib;
3.linux下包括静态库和共享库,共享库就是动态库。

静态库理解:
1.调用库时,会将静态库中所需要的代码复制到自己的程序中
2.程序中已包含代码,运行时不再需要静态库
3.程序运行时,不需要加载库,运行速度更快
4.程序占用更多的磁盘和内存空间
5.静态库升级后,程序需要重新编译链接
静态库的创建:
1.编写源文件hello.c
2.编译生成目标文件:gcc -c hello.c
3.创建静态库:ar crs libhello.a hello.o
4.查看库中符号信息:nm libhello.a 
5.编写程序test.c,并链接静态库:gcc -o test test.c -L. -lhello

共享库理解:
1.编译链接时仅记录用到哪个共享库中的哪个符号(即用到哪些函数),不复制共享库中的相关代码
2.程序不包含库中代码,尺寸小(是指外部程序调用库时)
3.多个程序可共享同一个库,共享库在内存中只需要有一个,不同的程序都可以同时调用共享库中的代码
4.因为库中代码没有复制到程序中,所以程序运行时需要加载库
5.共享库升级方便,无需重新编译程序
共享库的创建:
1.编写源文件hello.c,bye.c,此时的c源文件里是不带main函数的
2.编译生成目标文件:gcc -c -fPIC hello.c bye.c,选项-fPIC:表示生成与位置无关的代码
3.起一个共享库名字common,并创建共享库:gcc -shared -o libcommon.so.1 hello.o bye.o
  选项-shared表示创建的是一个共享库,libcommon.so.1中1代表版本,也可以是2,3,4
4.为共享库文件创建链接文件:ln -s libcommon.so.1 libcommon.so,链接文件必须是libcommon.so形式,不能是其他形式
共享库的使用:
1.写一个程序test.c,调用库中的函数hello.c和bye.c
2.编译test.c,并链接共享库libcommon.so:gcc -o test test.c -L. -lcommon,-L是指定搜索的路径

问题1:共享库和静态库在链接库时,都执行的同一句,如何区分是链接的动态库还是静态库?
1.gcc编译器会默认先去链接共享库,如果找不见共享库,就会链接静态库,如果静态库也没有就会报错
2.如果要指定链接静态库,则需要加选项-static:

问题2:链接动态库时出现:./test: error while loading shared libraries: libcommon.so: cannot open shared object file: No such file or directory
原因:我们程序链接的是共享库,并没有复制库中的代码,所以程序在执行的时候,系统会去加载用到的共享库,加载的时候会默认去/lib、或者/usr/lib路径下去找共享库,而我们的共享库是放在当前目录下的,而当前目录并不在系统的搜索路径里。因此,执行的时候找不见共享库而报错。
解决方法:修改shell下的环境变量:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
解释:把这个环境变量导出,引用原先的路径,在其后面追加一个新路径.,新路径和原先路径之间用:分隔开,.代表当前路径

如何让系统找到共享库?(三种方法)
1.把库拷贝到/usr/lib或者/lib目录下(不推荐,可能会和系统库重名)
2.在LD_LIBRARY_PATH环境变量中添加库所在路径(只能对当前shell有用,再打开一个终端运行时还是会报错))
3.修改系统的配置文件,往配置文件中添加库的路径,最终将库加载到系统默认的搜索路径里(常用)
方法:进入/etc/ld.so.conf.d/目录下,自己新建一个.conf文件,把库的路径加到.conf文件里,再执行ldconfig刷新即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值