linux系统中程序库文件简介

linux系统中程序库文件简介

ID:9241038

大小:28.82 KB

页数:13页

时间:2018-04-25

linux系统中程序库文件简介_第1页
linux系统中程序库文件简介_第2页
linux系统中程序库文件简介_第3页
linux系统中程序库文件简介_第4页
linux系统中程序库文件简介_第5页
资源描述:

《linux系统中程序库文件简介》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Linux系统中程序库文件简介 简介 库文件一般就是编译好的二进制文件,用于在链接阶段同目标代码一起生成可执行文件,或者运行可执行文件的时候被加载,以便调用库文件中的某段代码。它与可执行文件相同之处是:两者都是编译好的二进制文件(本文中我们讨论的二进制文件,假设都是Linux上面最常见的ELF格式);与可执行文件不同的是:库文件无法直接执行(直观上来看它的源代码中没有main函数,而只是一些函数模块的定义和实现,没有运行的入口主函数,所以无法直接执行)。我们开发的程序,无论是运行的时候,还是编译、链接的时候,一般都需要借助一些库来实现它们的功能,而很少直接只通过程序源

2、代码生成完全独立的可执行文件。有许多著名的常用的用于开发或者运行程序所需的库,例如Qt库,gtk库,甚至是标准C库等等,通过使用它们可以充分体会到模块化编程和代码重用等的好处。本文对Linux库的编译,生成,使用进行了简单的介绍,并且通过一个简单例子(开发自己的库)进行说明。 主要内容 原理 举例 其它 [原理] 为便于理解,我们可以将库分为三种类型:静态库,共享库,动态加载库,。下面分别介绍。 一、静态库静态库实际就是一些目标文件(一般以.o结尾)的集合,静态库一般以.a结尾,只用于链接生成可执行文件阶段。具体来说,以c程序为例,一般我们编译程序源代码的时候,过程大

3、致是这样的:以.c为后缀的源文件经过编译生成.o的目标文件,以.o为后缀的目标文件经过链接生成最终可执行的文件。我们可以在链接的时候直接链接.o的目标文件,也可以将这些.o目标文件打包集中起来,统一链接,而这个打包生成的集中了所有.o文件的文件,就是静态库。静态库只在程序链接的时候使用,链接器会将程序中使用到函数的代码从库文件中拷贝到应用程序中,一旦链接完成生成可执行文件之后,在执行程序的时候就不需要静态库了。由于每个使用静态库的应用程序都需要拷贝所用函数的代码,所以静态链接的生成的可执行文件会比较大,多个程序运行时占用内存空间比较大(每个程序在内存中都有一份重复的静

4、态库代码),但是由于运行的时候不用从外部动态加载额外的库了,速度会比共享库快一些。 我们将在后面的例子中看到静态库的生成和应用的具体过程。 二、共享库1、共享库的概念共享库以.so结尾.(so==shareobject)在程序链接的时候并不像静态库那样从库中拷贝使用的函数代码到生成的可执行文件中,而只是作些标记,然后在程序开始启动运行的时候,动态地加载所需库(模块)。所以,应用程序在运行的时候仍然需要共享库的支持。共享库链接出来的可执行文件比静态库链接出来的要小得多,运行多个程序时占用内存空间比也比静态库方式链接少(因为内存中只有一份共享库代码的拷贝),但是由于有一个

5、动态加载的过程所以速度稍慢。 2、共享库的命名 一般一个共享库有三个名字:soname,real-name,linker-name。 soname是用于区分版本的名字,它可能就是指向real-name(如果有这个文件的话)的链接,名称的形式一般是lib*.so.X.Y(这里的X,Y就是代表版本号)。 real-name是包含真正代码的实现文件。 linker-name是传递给连接器的名字,用于链接的搜索,一般它可能就是指向soname的连接,名称的形式一般是lib*.so。 这样做的目的主要是允许系统中多个版本的库文件共存,习惯上在命名库文件的时候通常与soname相

6、同。下面看一个实例: [quietheart@lv-ktest]$ls-l/usr/lib/libncurses* lrwxrwxrwx1rootroot    202010-07-2616:51libncurses.so->/lib/libncurses.so.5 lrwxrwxrwx1rootroot    132010-07-2617:18libncurses.so.5->libtermcap.so 上面的libncurses.so.5就是soname,其中ncurses是库名,5分别是主版本号(major),当然也可以有次版本号(minor)和发行号(rele

7、ase)。(类似于libncurses.so.5.0.0)。这里的".so"表示共享库。通常soname只是realname的一个链接。而libtermcap.so是ncurse库的real-name,也就是包含真实代码实现的文件。libncurses.so则是linkername,用于应用程序链接的时候的一个搜索名使用这个名字传递给链接器进行链接。它通常是soname的一个链接,形式为libname.so。 实际上,每一个库都有一个soname,当连接器发现它正在查找的程序库中有这样一个名称,连接器便会将soname嵌入连结中的二进制文件内,而不是

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

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

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