- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
第四章Linux平台上的软件开发;4.5库的开发、调试和使用;简介;函数库;库函数的位置;为什么要使用二进制库;4.5.1库的使用;使用标准库函数;非标准库函数;例题;常见的与库有关的编译错误;C程序的构成;静态库和动态库;WINDOWS的动态链接库;LINUX的共享库;创建静态库和动态库;?程序1:hello.h;程序3:main.c;三个文件;第2步:将hello.c编译成.o文件;
无论静态库,还是动态库,都是由.o文件创建的。因此,我们必须将源程序hello.c通过gcc先编译成.o文件。
在系统提示符下键入以下命令得到hello.o文件。
$gcc-chello.c
$;第3步:由.o文件创建静态库;
静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。
例如:我们将创建的静态库名为myhello,则静态库文件名就是libmyhello.a。
创建静态库用ar命令。
;在系统提示符下键入以下命令将创建静态库文件libmyhello.a。
$arcrlibmyhello.ahello.o
$
我们同样运行ls命令查看结果:
$ls
hello.chello.hhello.olibmyhello.amain.c
$
ls命令结果中有libmyhello.a。;在程序3:main.c中,我们包含了静态库的头文件hello.h,然后在主程序main中直接调用公用函数hello。
下面先生成目标程序hello,然后运行hello程序看看结果如何。
$gcc-ohellomain.c–L.-lmyhello
$./hello
Helloeveryone!
$;我们删除静态库文件试试公用函数hello是否真的连接到目标文件hello中了。
$rmlibmyhello.a
rm:removeregularfile`libmyhello.a?y
$./hello
Helloeveryone!
$
程序照常运行,静态库中的公用函数已经连接到目标文件中了。;创建动态库;用编译命令创建动态链接库;在系统提示符下键入以下命令得到动态库文件libmyhello.so。
$gcc-shared-olibmyhello.sohello.o
$
;;第6步:在程序中使用动态库;
在程序中使用动态库和使用静态库完全一样,也是在使用到这些公用函数的源程序中包含这些公用函数的原型声明,然后在用gcc命令生成目标文件时指明动态库名进行编译。
我们先运行gcc命令生成目标文件,再运行它看看结果。
$gcc-ohellomain.c-L-lmyhello
$./hello;./hello:errorwhileloadingsharedlibraries:libmyhello.so:cannotopensharedobjectfile:Nosuchdirectory
出错了!错误提示表明原来是找不到动态???文件libmyhello.so。
程序在运行时,会在/usr/lib和/lib等目录中查找需要的动态库文件。若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。
我们将文件libmyhello.so复制到目录/usr/lib中,再试试。;$mvlibmyhello.so/usr/lib
$./hello
Helloeveryone!
$
成功了。这也进一步说明了动态库在程序运行时是需要的。;我们回过头看看,发现使用静态库和使用动态库编译成目标程序使用的gcc命令完全一样,
$gcc-ohellomain.c–L.–lmyhello
$gcc-ohellomain.c–L.-lmyhello
那当静态库和动态库同名时,gcc命令会使用哪个库文件呢?;先删除除.c和.h外的所有文件,恢复成我们刚刚编辑完举例程序状态。
$rm-fhellohello.o/usr/lib/libmyhello.so
$ls
hello.chello.hmain.c
$
再来创建静态库文件libmyhello.a和动态库文件libmyhello.so。;$gcc-chello.c
$arcrlibmyhello.ahello.o
$gcc-shared-fPCI-olibmyhello.sohello.o
$ls
hello.chello.hhello.olibmyhello.alibmyhello.somain.c
$
通过上述最后一条ls命令,可以发现静态
原创力文档


文档评论(0)