【发布时间】: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