linux自己制作函数库.docx

linux自己制作函数库.docx

ID:59254201

大小:16.49 KB

页数:6页

时间:2020-09-08

linux自己制作函数库.docx_第1页
linux自己制作函数库.docx_第2页
linux自己制作函数库.docx_第3页
linux自己制作函数库.docx_第4页
linux自己制作函数库.docx_第5页
资源描述:

《linux自己制作函数库.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、在Linux下如何使用自己的库函数在Linux下如何使用自己的库函一 使用库必要性:提高代码重用性。二  库的种类:   1 静态库     一般以*.a命名。     程序编译时被加载,此后,只要程序不被重新编译,静态库就没有作用了(可以删掉)。由于静态库的代码在编译过程中已经被载入可执行程序,因此体积较大,如果有多个应用程序都用了同一个静态库,在存放可执行程序的硬盘中就会有这个静态库的多份拷贝。如果他们同时在运行,那么在内存中也会有这个静态库的多份拷贝。但是如下面提到的动态库相比较,程序执行时间比较短,因为没

2、有执行时库函数的加载。所谓“以空间换时间”。    下面我们用一个实例说明静态库的编程和使用。     //库函数:hellowlib.c     #includevoidprinthellow()    {           printf("hellow,nowinlibroutine");           return;}首先生成目标文件:gcc-c  printhellow.c  –oprinthellow.o然后使用ar(archive)命令把目标文件制作库文件:arcqslibhello.ap

3、rinthellow.o注意库文件名一定是lib***.a格式,不要忘了加lib作为前缀。下面我们写一个程序调用静态库libhello.a中的printhellow函数。//testlib.cintmain(intarc,char**argv){   printhellow();    return;}下面编译:gcc-otestlibtestlib.c-L./  -lhello即可生成可执行文件testlib。注意上面的-L(大写)指示库的路径在当前目录下。如果没有这个选项,就需要把库libhello.a加入到

4、标准路径中。如/usr/lib中。-l(小写)只需要跟hello,其他字符全部不要,否则出错。     2 动态库(共享库)一般以.so命名(shareobject)与静态库不同,共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。与上面提到的静态库相比,很是节约空间。但运行时需要载入,因此运行时间相对静态库而言比较长。所谓“以时间换空间”。动态链接的意思就是在程序装载内存的时候才真正的把库函数代码链接进行确定它们的地址,并且就算有几个程序同时运行,内存也只存在一份函数代码。

5、动态库的代码要实现这样的功能,必须满足这样一种条件:能够被加载到不同进程的不同地址,所以代码要经过特别的编译处理,我们把这种经过特别处理的代码叫做“位置无关代码(PositionindependedCode.PIC)”。位置无关代码可以这样看,内存中的动态代码只有一份副本,但动态库的数据却可能有多份。由于每一个链接到动态的进程都可能会修改库的数据,所以每当有这种情况,操作系统就复制出一份数据副本,然后修改进程的地址空间映射,使它指向新的数据副本,这样,进程最后修改的只是属于自己的那份数据。更详细来说,某个程序的在

6、运行中要调用某个动态链接库函数的时候,操作系统首先会查看所有正在运行的程序,看在内存里是否已有此库函数的拷贝了。如果有,则让其共享那一个拷贝;只有没有才链接载入。这样的模式虽然会带来一些“动态链接”额外的开销,却大大的节省了系统的内存资源。我们所知C的标准库就是动态链接库,即系统中所有运行的程序共享着同一个C标准库的代码段。正如刚才所说,由于动态链接库函数不会被拷贝到可执行文件中。编译的时编译器只会做一些函数名之类的检查。程序运行时,被调用的动态链接库函数被安置在内存的某个地方,所有调用它的程序将指向这个代码段。

7、因此,这些代码必须是相对地址,而不是绝对地址。在编译的时候,我们需要告诉编译器,这些对象文件是用来做动态链接库的,所以要用地址无关代码(PositionIndependentCode (PIC))。 共享库又可分为动态链接(Dynamiclinking)和动态加载(Dynamicloading)两种。  2.1  动态链接(Dynamiclinking)    在编译程序时指定要连接的库,然后再程序运行时一开始就将库载入。这也称为隐式调用库函数。     示例仍然使用钢材程序,编译库:      gcc-fpic

8、-shared-olibhello.soprinthellow.c      -fpic便指示了这是地址无关代码,-shared指示是一个共享库编译程序,和静态库使用方法一样:gcc-otestlibtestlib.c-L./-lhello      这时候编译成功,但我们执行testlib却发生以下错误:      ./testlib:errorwhileloading

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。