gpt4 book ai didi

c++ - 关于 Unix 上共享库的困境

转载 作者:IT王子 更新时间:2023-10-29 00:45:58 26 4
gpt4 key购买 nike

如果我构建一个共享库(共享对象),我可以通过以下两种方式使用它:
第一种方法是像使用静态库一样使用共享库。

           #include "myLib.h"
//...
//afterwards I can use functions defined in mylib.h
myFunction();

第二种使用共享库的方法是调用动态加载器API函数:dlfcn的dlopendlsymdlclose .h。例如,当我想实现一个插件模式时,我会以这种方式使用共享库。列表看起来像这样:

#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 标志(位置独立代码)的共享库,我是否能够以第二种方式使用它?

干杯

最佳答案

这两种使用模式通常称为隐式和显式。正如您正确指出的那样,加载的区别在于,在执行 dlopen 时加载显式链接的动态库,而在将应用程序加载到内存中时加载隐式链接的库。每个 dlopen 可能需要几毫秒才能完成,除非库已经加载,在这种情况下它非常快,所以如果您有非常严格的延迟要求或需要频繁加载/卸载,那么您可以决定隐式链接或显式加载库在程序启动时不要卸载它,直到它不再被使用。

关于c++ - 关于 Unix 上共享库的困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4411386/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com