我有以下代码
-
文件 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问题的严重影响。你试图想出各种各样的鲁布·戈德伯格式的解决方案来解决一个相当简单的问题,你花了一周多的时间才最终泄露出来。不要问潜在的解决方案,而要问你试图解决的潜在问题。所有库加载的东西都是与你的问题完全无关的,你根本不需要关心它。