linux下库的介绍与使用

1. linux中的库

       库用于将相似函数打包在一个单元中。然后这些单元就可为其他开发人员所共享,并因此有了模块化编程这种说法。在linux下常见的库文件,就是*.so文件。Linux中绝大多数.so文件都存放在/lib、/usr/lib/(见Linux目录结构),对于64位和32位共存的系统,32位的动态库可能会放在/lib32.


2.动态库和静态库

      Linux支持两种类型的库,每一种库都有各自的优缺点。静态库是在编译阶段随用户程序一块进行编译。动态库则不同,它是在加载应用程序时被加载的,而且它与应用程序是在运行时绑定的。

linux下库的介绍与使用_第1张图片

       在linux中的库有静态库和动态库两种,其中动态库又分为动态链接库和动态加载库两种。

 

       linux下库的介绍与使用_第2张图片


3.动态链接库和动态加载库

        GNU/Linux提供两种处理共享库的方法。

        (1)动态链接库

          您可以动态地将程序和共享库链接并让 Linux 在执行时加载库(如果它已经在内存中了,则无需再加载)。

        (2)动态加载库

         使用动态加载的过程,这样程序可以有选择地调用库中的函数。使用动态加载过程,程序可以先加载一个特定的库(已加载则不必),然后调用该库中的某一特定函数。这是构建支持插件的应用程序的一个普遍的方法。这种方法需要使用linux提供的动态加载DL API来控制加载库以及使用库中的函数。DL提供的API如下表所示:

表 1. Dl API
函数 描述
dlopen 使对象文件可被程序访问
dlsym 获取执行了 dlopen 函数的对象文件中的符号的地址
dlerror 返回上一次出现错误的字符串错误
dlclose 关闭目标文件
如下是使用DL API的例程:

#include <stdio.h>
#include <dlfcn.h>
#include <string.h>

#define MAX_STRING      80


void invoke_method( char *lib, char *method, float argument )
{
  void *dl_handle;
  float (*func)(float);
  char *error;

  /* Open the shared object */
  dl_handle = dlopen( lib, RTLD_LAZY );
  if (!dl_handle) {
    printf( "!!! %s\n", dlerror() );
    return;
  }

  /* Resolve the symbol (method) from the object */
  func = dlsym( dl_handle, method );
  error = dlerror();
  if (error != NULL) {
    printf( "!!! %s\n", error );
    return;
  }

  /* Call the resolved method and print the result */
  printf("  %f\n", (*func)(argument) );

  /* Close the object */
  dlclose( dl_handle );

  return;
}


int main( int argc, char *argv[] )
{
  char line[MAX_STRING+1];
  char lib[MAX_STRING+1];
  char method[MAX_STRING+1];
  float argument;

  while (1) {

    printf("> ");

    line[0]=0;
    fgets( line, MAX_STRING, stdin);

    if (!strncmp(line, "bye", 3)) break;

    sscanf( line, "%s %s %f", lib, method, &argument);

    invoke_method( lib, method, argument );

  }

}

4.库文件生成,修改工具ar

      ar命令可以用来创建、修改库,也可以从库中提出单个模块。库是一单独的文件,里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member)。原始文件的内容、模式、时间戳、属主、组等属性都保留在库文件中。

      ar工具的详细使用可以参见http://blog.csdn.net/xuhongning/article/details/6365200


学习资料来源于:

http://www.ibm.com/developerworks/cn/linux/l-dynamic-libraries/

http://blog.csdn.net/xuhongning/article/details/6365200

你可能感兴趣的:(linux下库的介绍与使用)