操作系统 百分网手机站

关于在Linux平台上接静态库和共享库的使方法

时间:2020-01-17 操作系统 我要投稿

  1、Linux函数库介绍

  函数库可以看做是事先编写的函数集合,它可以与主函数分离,从而增加程序开发的复用性。Linux中函数库可以有3种使用的形式:静态、共享和动态。

  1)静态库的代码在编译时就已连接到开发人员开发的应用程序中;

  2)而共享库只是在程序开始运行时才载入;

  3)动态库也是在程序运行时载入,但与共享库不同的是,动态库使用的库函数不是在程序运行使开始载入,而是在程序中的语句需要使用该函数时才载入。动态库可以在程序运行期间释放动态库所占用的内存,腾出空间供其他程序使用。

  注:

  l由于共享库和动态库并没有在程序中包括库函数的内容,只是包含了对库函数的引用,因此代码的规模比较小。

  l系统中可用的库大都存放在/usr/local/lib、/usr/lib、/lib、目录中。

  l头文件大都放在/usr/include、/usr/local/include目录下。

  l共享库的相关配置文件和管理命令如下:

  /etc/ld.so.conf:包含共享库的搜索位置。

  ldconfig:共享库管理工具,一般在更新了共享库之后要运行该命令。

  ldd:可以查看可执行文件所使用的共享库。

  l库文件名由前缀lib和库名以及后缀组成,根据库的类型不同,后缀名也不一样。

  2、大量使用库文件的主要原因

  1)为了便于编程,对于部分经常使用的函数,相应的开发语言都提供了对应的库文件支持。

  2)隐藏具体的函数实现细节。程序员在使用库文件时,只需要包含所需要函数所在的头文件,而不必关心该函数的具体实现。对于商业软件来说,其知识产权也得到了一定的保护。

  3、使用这些库函数都有什么途径

  在任何编程环境中,库文件都是一些预先编译好的函数集合,这些函数以二进制代码形式存储在库文件中。用户要使用这些函数,只需要包含这些库文件即可。一般来说,要从库文件获得相应的函数有两种办法。

  1)在编译时将库中相应函数的二进制映像代码直接拷贝到当前编译的程序中,当前程序是独立运行的。这种库我们叫做静态库,在Linux中,以.a为后缀的为静态库。

  2)在编译时只引用库中相应函数的二进制映像代码的入口地址(不直接拷贝),该程序在运行时从共享库文件中读出该函数代码(这需要首先将共享库加载到内存中),从而间接引用,这种库我们称之为共享库,在Linux中,以libxxx.xo.x.x为格式命名。

  4、具体如何使用

  使用静态库、共享库和动态库三种类型的方法很相似,都是使用选项是“-l”(注意这里是小写的“L”)。该选项是用于指明具体使用的库文件。由于在Linux中函数库的命名规则都是以“lib”开头的,因此,这里的库文件只需填写lib之后的内容即可。如:有静态库文件libm.a,在调用时只需写作“-lm”;同样对于动态库文件libm.so;在调用时也只需写作“-lm”即可,其整体调用命令类似如下:

  [root@localhost gcc]# gcc -o dynamic –L /root/lq/testc/lib/ dynamic.o -lmydynamic

  那么,若系统中同时存在文件名相同的静态库文件和动态库文件时,该链接选项究竟会调用静态库文件还是动态库文件呢?经测试后可以发现,系统调用的是动态库文件,这是由于Linux系统中默认的是采用动态链接的方式。这样,若用户要调用含有同名动态库文件的静态库文件,则在“-l”后需要显示地写出包含后缀名的文件名,如:要调用libm.a库文件时就需写作“-llibm.a”。

  1)如果你已经有一个静态库文件libhello.a,此库文件的头文件为libhello.h,其内容如下:

  #ifndef __libhello_H__

  #define __libhello_H__

  void print_hello(void); //print hello world,this is library to console

  #endif __libhello_H__

  我们可以从上面的代码看出,头文件知道libhello.a库文件包含了print_hello()函数,其返回值类型和参数都为空。因此,在编写程序时,你只需要使用此函数(在包含头文件的前提下),而不用去管其具体实现细节。