是否有任何链接器标志告诉在打开后延迟加载动态库
Is there any linker flag that tells to defer the loading of dynamic library after dlopen
我有以下代码
-
文件 hello.cc
static A dummyl; A:: A() { fun(); } void A::fun() { int y = 10; int z = 20; int x = y + z; }
-
文件 hello.h
class A { public: A a; void fun(); };
-
文件 main.cc
#include <dlfcn.h> #include "hello.h" typedef void (*pf)(); int main() { void *lib; pf greet; const char * err; printf("n Before dlopenn"); lib = dlopen("libhello.so", RTLD_NOW | RTLD_GLOBAL); if (!lib) { exit(1); } A *a = new A ; a->fun(); dlerror(); /*first clear any previous error; redundant in this case but a useful habit*/ dlclose(lib); return 0; }
构建阶段:
- g++ -fPIC -c hello.cc
- g++ -shared -o libhello。所以hello.o
- g++ - 0 myprogram main。cc -ldl -L。-lhello
因为我的共享库在实际情况下是libQtCore。所以,我需要在链接器中使用-lQtCore
来链接它,因为我不能直接使用符号,而且因为有许多函数然后libQtCore,实际上不建议使用 lysym对于libQtCore.so
链接器g++是否有任何标志告诉编译器只在_dlopen _之后加载共享库?
是的。在Windows上。这就是所谓的延迟加载。它在Linux/OS x上不存在。实现它是可能的,但需要修改binutils和ld.so
。有关这方面的背景信息,请参阅本文。
但是你不需要关心的任何。真的。
你正面临着一个众所周知的问题。众所周知,它甚至有一个名字:静态初始化顺序惨败。
解决所有问题的方法很简单:不要像以前那样使用静态全局变量。
要修复它,使用Q_GLOBAL_STATIC
,或自己重新实现类似的东西。这样,值将在第一次使用时被构造,而不是过早地构造。这就是全部。
旁注:你最近的问题受到了XY问题的严重影响。你试图想出各种各样的鲁布·戈德伯格式的解决方案来解决一个相当简单的问题,你花了一周多的时间才最终泄露出来。不要问潜在的解决方案,而要问你试图解决的潜在问题。所有库加载的东西都是与你的问题完全无关的,你根本不需要关心它。
相关文章:
- 为什么有些延迟加载 DLL 会立即使用 FFMPEG 卸载?
- 从 C 可执行文件加载动态库时收到错误C++"undefined symbol"
- 使用CFBundleCreate在C++中的Mac上加载动态共享库(DLL)
- 指向临时对象的自定义迭代器(延迟加载)
- 延迟加载加密++密码.dll
- 地址清理器和运行时加载动态库 ->(<未知模块>)
- C++插件不能延迟加载dll时
- 延迟加载的 DLL 在内存中彼此相距太远
- 延迟加载opengl32.dll失败,出现Qt5
- 使用延迟加载加载正确的库 - 返回值类型错误
- 从zip、内存等加载动态库
- 延迟加载可以被视为RAII的一个例子吗
- 我们可以在链接期间加载动态库吗
- 延迟加载DLL
- 从内存加载动态库
- 加载动态链接库的第三种方法?大头针
- 以下代码是如何工作的(从DLL加载动态类)
- 延迟加载DLL时的函数原型
- Xcode 将 dylib 复制到具有延迟加载功能的捆绑包中
- 是否有任何链接器标志告诉在打开后延迟加载动态库