实验10 编写库文件.pptVIP

  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文档。上传文档
查看更多
实验10 编写库文件

编写库文件 为什么要编写库文件 每个项目里都有重复的模块,造成代码重复。 而且,代码的重用性不好,一旦变化,为了保持设计的一致性,必须手动逐个修改。 库文件就是对公共代码的一种组织形式。 比如,一个用户验证功能的库文件: //userlogin.h文件,提供函数声明 int isvaliduser(char* username, int namelen); //userlogin.c文件,实现对用户信息的验证 int isvaliduser(char* username, int namelen) { int isvalid = 0; /*下面是具体的处理代码,略去*/ return isvalid } 库文件分类 静态库:程序在编译时加载库文件,即静态库代码在编译时就拷贝到了程序的代码段,程序的体积会膨胀。 “以空间换时间”。 动态库:程序在运行时加载目标代码,即程序中只保留库文件的名字和函数名,在运行时去查找库文件和函数体,程序的体积基本变化不大。 “以时间换空间”。 静态库的编写要点 静态库文件的扩展名一般为.a,其编写步骤为: 编写函数代码 编译生成各目标文件 用ar文件对目标文件归档,生成静态库文件 注意归档文件名必须以lib打头 使用要点: 在gcc 的-i参数后加上静态库头文件的路径 在gcc 的-l参数后加上库文件所在目录 在gcc 的-l参数后加上库文件名,但是要去掉lib和.a扩展名 比如库文件名是libtest.a 那么参数就是 -l test 示例——编写静态库 编写如下两个文件,注意放在同一目录中 myalib.h //静态库头文件 myalib.c //静态库实现文件 //myalib.h 文件的内容 void test(); ? //myalib.c 文件的内容 #inlcude void test() { printf(test\n); } 示例——制作静态库 生成目标文件 gcc -c myalib.c 执行完后会生成一个myalib.o文件 用ar命令归档,格式为ar -rc 再次提醒,归档文件名一定要以lib打头, .a结尾。 ar -rc libtest.a myalib.o 执行完后会生成一个libtest.a文件 示例——使用静态库 编写一个测试程序main.c,内容为: #include myalib.h //要把函数的头文件包含进来,否则编译时会报错 int main(int argc,char* argv[]) { test(); return 0; } 编译目标文件,注意要把静态库头文件的路径加到-i参数里面 gcc -i /root/exercise -o main.o -c main.c 生成可执行文件,注意要把静态库文件的路径加到-l参数里面, 把库文件名(去掉打头的lib和结尾的.a)加到-l参数后面 gcc -o main -l/root/exercise main.o –ltest 执行可执行文件查看效果./main 动态库的编写要点 动态库一般以.so结尾,就是shared object的意思 基本生成步骤为: 编写函数代码 编译生成动态库文件,要加上 -shared 和 -fpic 选项,库文件名以lib开头, 以.so 结尾 使用方式分为两种:隐式调用和显示调用 隐式调用:类似于静态库的使用,但需修改动态链接库的配置文件/etc/ld.so.conf 显示调用:在主程序里使用dlopen、dlsym、dlerror、dlclose等系统函数 示例——编写动态库(与前面一样) 编写如下两个文件,注意放在同一目录中 myalib.h //静态库头文件 myalib.c //静态库实现文件 //myalib.h 文件的内容 void test(); ? //myalib.c 文件的内容 #inlcude void test() { printf(test\n); } 示例——制作 编译生成动态库,库文件名以lib开头,以.so 结尾。 gcc -fpic -shared -o libtest.so myalib.c 此时就生成一个libtest.so文件 示例——动态库的隐式调用 1、编写测试文件,与前面一样 2、编译测试程序,与静态库类似,要把头文件的路径加到-i参数里面 gcc -i /root/exercise -o main.o -c main.c 现在生成了一个main.o文件 3、连接生成测试程序,注意要把库文件的路径加到-l参数里面 gcc

文档评论(0)

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

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档