- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
- WINCE6下自绘EDIT.doc
- 2011年微波技术与天习题.doc
- .net+sql图书管理系统论文.doc
- 024周末大闯关指.doc
- 015S概述.ppt
- 03-C语言的基本知识.doc
- (北师大版)四年级数学下册课件.ppt
- (全)2010年与2011年全国硕士研究生入学统一考试政治理论大纲变化详解.doc
- 09年秋期末七年级数学试题.doc
- 1.1.2程序框图的概念(条件结构)(高中数学人教版必修三).ppt
- 初中英语人教版七年级上册第四单元Where is my schoolbag ! Section A .ppt
- 初中英语人教版七年级上册第四单元Where is my schoolbag Section B 2.ppt
- 初中英语人教版七年级下册 Unit 6 I'm watching TV. Section A 11a.pptx
- 注册土木工程师培训课件.ppt
- 初中生物济南版七年级上册第一章奇妙的生命现象 第三节生物学的探究方法.ppt
- 初中英语人教版七年级上册第四单元Where is my schoolbag Section B 2.pptx
- 注册安全工程师案例课件.ppt
- 初中物理人教版八年级上册第二章第4节噪声的危害和控制课件(共19张PPT).pptx
- 注册安全工程师王阳课件.ppt
- 初中数学青岛版八年级上2.4《线段的垂直平分线》课件(16张PPT).ppt
原创力文档


文档评论(0)