如果我構建共享庫(共享對象),我可以通過以下兩種方式使用它:第一種方法是使用共享庫,就像我將使用靜態庫一樣。Unix上共享庫的困境
#include "myLib.h"
//...
//afterwards I can use functions defined in mylib.h
myFunction();
使用共享庫的第二種方法是通過調用動態加載器API函數:dlopen
,dlsym
,和從dlfcn.h
dlclose
。例如,當我想實現插件模式時,我會以這種方式使用共享庫。清單應該是這樣的:
#include <dlfcn.h>
void *myLib; /* Handle to shared lib file */
void (*myFunction)(); /* Pointer to loaded function */
//...
//load shared object
myLib = dlopen("/home/dlTest/myLib.so",RTLD_LAZY);
dlerror();
//get handle to function
myFunction = dlsym(myLib, "myFunction");
dlerror();
//execute function
(*myFunction)();
//close lib
dlclose(myLib);
dlerror();
現在我的第一個問題是:是什麼在加載時間上的共享對象的這兩種用法之間的區別?通過第一種方式使用共享庫,我們在加載時將共享庫鏈接/加載到主應用程序,第二種方式是在運行時間做同樣的事情?
第二個問題。這兩種用法的名稱是什麼? 第一個被稱爲靜態鏈接共享庫,第二個是動態鏈接/加載共享庫?
第三個問題如果我已經建立了一個共享庫沒有-fPIC
標誌(osition無關的代碼),我將能夠以第二種方式來使用它?
Cheers
如果我更改共享庫並重新編譯它,我必須重新鏈接使用該共享庫,如果我使用隱式連接所有主要的應用程序,或者它完成時自動這些應用程序的負載? – 2010-12-11 17:24:18