如果我构建共享库(共享对象),我可以通过以下两种方式使用它:第一种方法是使用共享库,就像我将使用静态库一样。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