嵌入式应用程序设计(Linux)12计科(3章).pptVIP

嵌入式应用程序设计(Linux)12计科(3章).ppt

  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文档。上传文档
查看更多
嵌入式应用程序设计(Linux)12计科(3章)

库函数-写一个自己的库 步骤2:把它们编译成目标文件 步骤3:打包为静态库,并为静态库创建索引 也可以使用以下命令实现以上功能 * 库函数-写一个自己的库 库文件名都是以lib开头的,静态库以.a作为后缀,表示Archive。ar命令类似于tar命令,起一个打包的作用,但是把目标文件打包成静态库只能用ar命令而不能用tar命令。选项r表示将后面的文件列表添加到文件包,如果文件包不存在就创建它,如果文件包中已有同名文件就替换成新的。S是专用于生成静态库的,表示为静态库创建索引,这个索引被链接器使用。ranlib命令为静态库创建索引。 * 库函数-写一个自己的库 步骤4:添加源码文件mylib.c和common.h来使用这个库。测试一下 * 库函数-写一个自己的库 步骤5:使用这个库编译运行源码,查看结果。 参数-L告诉编译器去哪里找需要的库文件,-L.表示在当前目录。-l库名告诉编译器要链接什么库。注意,即使库文件就在当前目录,编译器也不会去找的,所以-L选项不能少。编译器默认会找的目录可以用-print-search-dirs 选项查看一下。 * 库函数-写一个自己的库 * 库函数-写一个自己的库 其中libraries就是库文件的搜索路径列表,各路径之间用:号隔开。编译器会在这些搜索路径以及-L选项指定的路径中查找用-l选项指定的库。编译器在查找时默认优先考虑共享库,如果希望编译器只链接静态库,可以指定-static选项。 链接共享库和链接静态库有什么区别?在链接共享库时只是指定了动态链接器和该程序所需要的库文件,并没有真的做链接,可执行文件中调用的库函数仍然是未定义符号,要在运行时做动态链接。而在链接静态库时,链接器会把静态库中目标文件取出来和可执行文件真正链接在一起。 思考题:静态库和动态的优缺点? * 库函数-写一个自己的库 把函数add.c和sub.c链接为一个动态库。 步骤1:把他们编译成目标文件add.o,sub.o 编译时可以使用同上一样的方法,但是建议使用-fPIC选项进行编译,这两种方法编译出的目标文件有一点不一样。使用后者可以使共享库各段的加载地址不定死,即可以加载到任意位置。一般我们在做共享库时使用后者进行编译目标文件。PIC(Position Independent Code) * 库函数-写一个自己的库 步骤2:编译生成共享库 步骤3:使用这个库编译 步骤4:运行应用程序,但是报错找不到共享目标 * 库函数-写一个自己的库 编译时没有问题,因为-L.选项指定了共享库在当前目录,编译器可以在当前目录下找到共享库liblily.so,而运行时却找不到了。那么运行时是在那些路径下找共享库呢?可以用ldd命令查看可执行文件依赖于哪些共享库。 * 库函数-写一个自己的库 Ldd可以模拟运行一遍app,在运行过程中做动态链接,从而得知这个可执行文件依赖于哪些共享库,每个共享库都在什么路径下,加载到进程地址空间的什么地址。 是动态链接器,它的路径是gcc在编译链接时用指定的。 的路径是由动态链接器在做动态链接时搜索到的。 这个共享库其实不存在于文件系统中,它是由内核虚拟出来的共享库,所以它没有对应的路径,它负责处理系统调用。总之,共享库的搜索路径由动态链接器决定,所以由于找不到我们自己建立的 库路径,程序报错。 * 库函数-写一个自己的库 解决方法1:在运行app时通过环境变量LD_LIBRARY_PATH把当前库所在的目录添加到共享库的搜索路径中。 但是此方法只能在当前终端有效,另外对于变量LD_LIBRARY_PATH尽量不要修改它。(问题:为什么?) * 库函数-写一个自己的库 解决方法二:把库的绝对路径加入到系统配置文件/etc/ld.so.conf中。然后运行ldconfig。 * 库函数-写一个自己的库 使用ldconfig命令后会生成/etc/ld.so.cache缓存文件,动态链接器就这个缓存中搜索共享库。 解决方法3:把liblily.so拷贝到/usr/lib或者/lib目录下 解决方法4:在编译可执行文件app时就把liblily.so的路径写死在可执行文件中。 方法3,4同学们可以自己尝试一下。思考题:静态库和动态的优缺点? * 库函数-共享库的命名习惯 系统的共享库通常带有符号链接,共享库的命名习惯是有3个文件名:真的库文件(real name),包含完整的共享库版本号。符号链接名(soname,简单共享名,Short

文档评论(0)

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

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

1亿VIP精品文档

相关文档