我有以下代码
文件 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 dlopen\n");
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;
}
构建阶段:
由于我的实际共享库是 libQtCore.so ,我需要在链接器中使用-lQtCore
链接它,因为我不能直接使用符号,因为有很多函数那么 libQtCore ,对 libQtCore.so
由于我链接,我的静态全局变量在 dlopen 之前被初始化。链接器 g ++ 是否有任何标志告诉编译器只在_dlopen _之后加载共享库?
答案 0 :(得分:0)
是否有链接器g ++的标志告诉编译器只在_dlopen _之后加载共享库?
是。在Windows上。它被称为延迟加载。它在Linux / OS X上不存在。可以实现它,但它需要修改binutils和public static async void CopyTheFile(StorageFolder _subfolder, string strfilenm) {
try {
StorageFolder Bufolder = await KnownFolders.DocumentsLibrary.GetFolderAsync("MyTravel") ;
var targetFile = await _subfolder.GetFileAsync(strfilenm);
await targetFile.CopyAsync(Bufolder, strfilenm, NameCollisionOption.ReplaceExisting);
await targetFile.DeleteAsync();
} catch (Exception ex) {
}
}
。有关该问题的背景信息,请参阅this article。
但您不需要关心任何。真。
你正面临一个众所周知的问题。众所周知,它甚至有一个名字:The Static Initialization Order Fiasco。
解决你所有的困境是微不足道的:不要像你那样使用静态全局变量。
要修复它,请使用ld.so
,或者自己重新实现类似的功能。这样,价值将在首次使用时构建,而不是过早构建。这就是它的全部内容。
附注:作为XY Problem,您最近的问题严重受损。你正试图想出各种各样的Rube Goldberg式解决方案来解决一个相当简单的问题,它花了你一个星期+才最终泄露。不要问一个潜在的解决方案,但关于潜在的问题是你试图解决。所有库加载的东西都完全和完全不相关你的问题,你根本不需要关心它。