是否有任何链接器标志告诉dlopen后推迟加载动态库

时间:2016-09-14 23:24:35

标签: c++ qt gcc linker shared-libraries

我有以下代码

  1. 文件 hello.cc

    static A dummyl;
    
    A:: A() {
        fun();
    }
    
    void A::fun() {
        int y = 10;
        int z = 20; 
        int x = y + z;
    }   
    
  2. 文件 hello.h

    class A {
      public:
        A a;
        void fun();
    };
    
  3. 文件 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;
    }
    
  4. 构建阶段:

    1. g ++ -fPIC -c hello.cc
    2. g ++ -shared -o libhello.so hello.o
    3. g ++ -o myprog main.cc -ldl -L。 -lhello
    4. 由于我的实际共享库是 libQtCore.so ,我需要在链接器中使用-lQtCore链接它,因为我不能直接使用符号,因为有很多函数那么 libQtCore ,对 libQtCore.so

      的每个函数使用 dlysym 实际上是不明智的。

      由于我链接,我的静态全局变量在 dlopen 之前被初始化。链接器 g ++ 是否有任何标志告诉编译器只在_dlopen _之后加载共享库?

1 个答案:

答案 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式解决方案来解决一个相当简单的问题,它花了你一个星期+才最终泄露。不要问一个潜在的解决方案,但关于潜在的问题是你试图解决。所有库加载的东西都完全和完全不相关你的问题,你根本不需要关心它。