2010-09-02 124 views

回答

8

静态库或多或少只是对象文件的集合。如果您想在程序中使用静态库,则必须将可执行文件与其链接起来。然后可执行文件将包含静态库(或您使用的部分)。

如果要在运行时使用dlopen加载静态库,则必须先创建一个包含它的动态库libfoo.so

+0

该解决方法意味着如果我想动态加载它,我将不得不从静态库创建共享库。 这意味着动态加载静态库是不可能的,只有共享库可用于动态加载? 如果是这样,那么我从来源所述的报价是不正确的。 – 2010-09-02 14:04:28

+0

引用的文字不正确,或者我误解了它们的含义。 – JesperE 2010-09-03 10:06:52

4

打开.a文件使用dlopen确实不是工作(在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); 
} 

我得到:使用/usr/lib/libz.so

dlopen error=/usr/lib/libz.a: invalid ELF header 
lib_handle=(nil) 

而相反,我得到:

dlopen error=(null) 
lib_handle=0x19d6030 

所以相同的代码工作为共享对象。