在Linux中,静态库
*.a
能否在运行时动态加载呢?根据这里所说,静态和共享库都可以被用作动态加载库。那么如何动态加载静态库呢?静态库基本上只是一组目标文件的集合。如果您想在程序中使用静态库,则必须将可执行文件与其链接起来。然后,可执行文件将包含静态库(或您使用的部分)。
如果您想使用 dlopen
在运行时加载静态库,则需要先创建包含它的动态库 libfoo.so
。
使用dlopen
打开.a
文件无法正常工作(在Ubuntu 10.04上进行了测试)。下面是一个示例程序:
#include <dlfcn.h>
#include <stdio.h>
int main()
{
void *lib_handle = dlopen("/usr/lib/libz.a",RTLD_LAZY);
printf("dlopen error=%s\n",dlerror());
printf("lib_handle=%p\n",lib_handle);
}
I get:
dlopen error=/usr/lib/libz.a: invalid ELF header
lib_handle=(nil)
/usr/lib/libz.so
时,会得到以下结果:dlopen error=(null)
lib_handle=0x19d6030
因此,同样的代码可用于共享对象。