Linux应用程序中加载和连接共享库


    应用程序可能在它运行时要求动态连接器加载和连接任意共享库、而无需在编译时连接,动态连接是一项强大有用的技术,可以用于分发软件【就是软件的更新】,构建高性能Web服务【高性能Web服务器可以使用基于动态连接的更有效和完善的方法来更新内容】。
     基于动态连接的思想是将生成的动态内容的每个函数打包在共享库中,这就是各种软件进行更新的方法,所以可以动态的更新已有函数以及增加新的库函数就是修改功能和增加新功能。
     在windows生成动态连接库是.DLL文件,而在linux系列中生成的是.so文件,同样的,在任何软件开发中,动态连接库都是很重要的方面,比如JNI。
     在linux下导入动态连接库的方法是:
     #include
     /*下面是打开一个动态连接库句柄指针*/
     void *dlopen(const char * filename,int flag);


     /*下面是返回动态连接库中的函数地址*/
     void dlsym(void *handle,char *symbol);


     /*下面是关闭打开的动态连接库*/
     int dlclose(void *handle);
  
     /*下面是用来检测是否连接成功*/
     const char *dlerror(void);


上面的方法,在更新方法或功能时只要替换连接库就可以了。
在windows中使用:#pragam comment(lib,"library.DLL");


在linux中:
void *handle;
void (*addvec)(int *,int *,int *,int);
char *error;
handle=dlopen("/library.so",RTLD_LAZY);
addvec=dlsym(handle,"addvec");//其中的"addvec"就是动态链接库中的函数名//
/*在使用之前可以先使用dlerror()来检查看是否连接成功*/
addvec(x,y,z,2);
dlclose(handle);


在JNI中,上面的都被封装起来了,只提供了一个统一的接口System.loadLibrary("/library.so");
这样就可以直接调用想要调用的动态连接库中的方法了。





你可能感兴趣的:(深入理解计算机系统,Linux)