【问题标题】:Linking and loading shared libraries at runtime在运行时链接和加载共享库
【发布时间】:2015-03-01 16:21:04
【问题描述】:

我了解到您可以使用 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)更好,而不是在加载时更有用吗? 因为从示例来看,它似乎不是很有用。谢谢。

【问题讨论】:

  • 一个常见的例子是 3d 图形引擎和 OpenGL 库,在链接时可能无法知道哪个库版本可用,因此库必须在运行时加载。另一个常见用途是在运行时加载的外部模块。
  • 您的问题是针对 linux/posix (dlfcn.h / ".so" / you code) 还是更普遍?
  • @Christophe 的例子很具体,但问题很笼统

标签: c linker operating-system dynamic-linking


【解决方案1】:

但是有人能解释一下何时以及如何在运行时链接和加载 .so 会更好,而不是在加载时更有用吗?

至少有三个比较常见的用例:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 1970-01-01
    相关资源
    最近更新 更多