在运行时链接和加载共享库

时间:2015-03-01 16:21:05

标签: c linker operating-system dynamic-linking

我读到你可以使用dlfcn.h来使用动态链接器API这里是使用API​​的代码示例

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

int x[2]={1,2};
int y[2]={3,4};
int z[2];

int main(){
  void *handle;
  void(*addvec)(int *,int *,int *,int);
  char *error;

  // Dynamically load shared library that contains addvec()
  handle=dlopen("./libvec.so",RTLD_LAZY);
  if(!handle){
    fprintf(stderr,"%s\n",dlerror());
    exit(1);
  }
  // Get a pointer to the addvec() function we just loaded
  addvec=dlsym(handle,"addvec");
  if((error=dlerror())!=NULL){
      fprintf(stderr,"%s\n",dlerror());
      exit(1);
  }
  // now we can call addvec() just like any other function
  addvec(x,y,z,2);
  printf("z=[%d %d]\n",z[0],z[1]);

  // unload the shared library
  if(dlclose(handle)<0){
      fprintf(stderr,"%s\n",dlerror());
      exit(1);
  }
  return 0;
}

它在运行时加载并链接libvec.so共享库。 但有人可以解释何时以及如何在运行时链接和加载.so(在Windows上的DLL)在加载时更好,更有用?因为从示例中看它似乎没有用。感谢。

1 个答案:

答案 0 :(得分:1)

  

但有人可以解释何时以及如何在运行时链接和加载.so在加载时更好,更有用?

至少有三个相对常见的用例:

  • 可选功能(例如IF libmp3lame.so可用,用它来播放MP3。否则,功能不可用。)
  • 插件架构,主程序由第三方供应商提供,您可以开发自己的使用主程序的代码。这在例如迪士尼,其中Maya用于一般模型操作,但开发了专门的插件来为模型制作动画。
  • (上述变体):在开发期间加载和卸载库。如果程序需要很长时间来启动和加载其数据,并且您正在开发处理此数据的代码,则迭代(调试)代码的多个版本而不重新启动程序可能是有益的。您可以通过一系列dlopen / dlclose调用来实现这一目标(如果您的代码不修改全局状态,但例如计算一些统计信息)。