库及库的搜索顺序.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
库及库的搜索顺序

从本质上来说,库文件是一种可执行代码的二进制形式,包含了已经实现了的函数。 静态库:XXX.a。 假如有两个函数f1() f2()的实现。 静态库是把用到的函数的实现复制过来。所以程序运行时不需要.a。 若进程p1 p2都用到了函数f1(), 则使用包含该函数实现的静态库时,f1()会被拷贝两次,体积较大。 动态库:XXX.so 假如有两个函数f1() f2()的实现。 动态库中只记录了函数的入口地址,可执行程序的elf头中,说明了程序运行需要什么库。在执行时,才把函数的实现加载到内存中,尺寸小。假如进程p1 p2都用到了f1(),代码可共享。 xxx.a是在编译时,把代码复制,运行时不需要,运行快。 xxx.so 在编译时,保存函数的入口地址,运行时也需要。运行慢,因为需要动态库的加载,跳转。 静态库的创建 f1.c---f1.o f2.c---f2.o f3.c---f3.o f1.o f2.o f3.o 经过ar(archive), 生成libxxx.a 比如:ar crs libf.a f1.o f2.o f3.o 关于归档:多个文件合并成一个,以10K为单位分配空间,若文件的总和是10K的倍数,一般大,否则,会变大。 练习: hello.c void f() {…} 生成hello.o 生成ibhello.a main.c int main() { f(); } gcc –c hello.c –o hello.o ar crs libhello.a hello.o 静态库的使用 gcc –o hello main.c –L. –lhello ./hello 分析:-L是指定静态库的搜索位置。若不指定,默认搜索位置是/lib /usr/lib printf用到了c库,会默认连接c库。 sqrt ./a.out –lm 需自己连接 注意:若静态库不在当前位置,头文件不在当前位置 mv libhello.a ../ mv hello.h ../ gcc –o hello –I ../ main.c –L../ -lhello -Wall 此时看到一个警告,建议,在hello.h中先声明函数,main.c 引入头文件。 若xxx.a更新了,需重新生成.o libxxx.a,重新生成可执行程序。 创建共享库 gcc –c hello.c –fPIC –o hello.o gcc –shared –Wl,-soname,libhello.so –o libhello.so hello.o gcc –o hello main.c –L. –lhello ./hello会报错 提示找不到共享库 解决方法: 把共享库放在/lib或者/usr/lib下 修改LD_LIBRARY_PATH 第一种方法: LD_LIBRARY_PATH=./:$ LD_LIBRARY_PATH export LD_LIBRARY_PATH 注意:此种更改只在本次会话有效。修改~/.bashrc,加入上面语句。 第二种方法:写成一行 LD_LIBRARY_PATH=./:$ LD_LIBRARY_PATH ./hello 注意:此种更改只在本句话有效。 第三种方法: 第一步:sudo vi /etc/ld.so.conf.d/my.conf 加入以下内容 /home/linux /home/linux/libIO (注意可加多个目录,第二级目录需添加) 备注:该方式要求soname,必须是一个链接文件。 第二步:sudo ldconfig 共享库需要注意的问题 假如xxx.so中的函数发生了变化,即库升级了,xxx.so变成了xxx.so.2 应用程序也应该使用新的库,而我们不希望使用该库的程序重新编译,可以采用如下办法: gcc –c hello.c –fPIC –o hello.o gcc –shared –Wl,-soname,libhello.so –o libhello.so.2 ln –s libhello.so.2 libhello.so 若库中函数的签名没改,只是实现改了,原来的可执行程序hello,不用重新生成。 elf头中存的库名是soname后指定的名字。 若动态库和静态库同时存在,缺省先找.so,再找.a 若指明-static,则找静态库 gcc –o main main.c –L. –lhello –static 这样使得c库和hello库都找静态库。可以分别指定: gcc –o main main.c libhello.a 查看库中的符号 ldd a.out 或者 readelf –a a.out | grep Shared 关于库路径的搜索顺序 执行命令时不指定路径(不指定-L):gcc main.c –o t

文档评论(0)

yan698698 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档