2010-09-02 231 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 

所以相同的代碼工作爲共享對象。