在动态库之间共享静态库中的数据

时间:2014-01-04 10:41:40

标签: c++ qt singleton qtcore

我有下一个情况:

  1. A类的静态库; (记录器)
  2. A类实例创建为singleton
  3. 的主要应用程序
  4. 与( 1。)相关联的不同延迟加载动态库(插件),需要使用 A类的实例。
  5. 我应该如何在插件( 3。)之间共享主应用程序( 2。)中的单例? Qt / C ++中是否有任何功能可以做到这一点?

    目前我正在使用基于共享内存的丑陋解决方案,我不认为这是正确的。

    我正在考虑使用依赖注入模式进行重构,但它会带来一些限制。

    示例:

    静态库“log.lib”:

    struct Log
    {
      void write( QString text );
    };
    

    主要应用程序“app.exe”:

    Log *logger = new Log; // I need only one logger for all application 
    
    int main()
    {
      logger->write( "Main" );
      ...
    }
    

    插件1“plg1.dll”

    extern Log *logger; // Logger from "app.exe"
    void Foo()
    {
      logger->write( "Foo" );
    }
    

    插件2“plg2.dll”

    extern Log *logger; // Logger from "app.exe"
    void Bar()
    {
      logger->write( "Bar" );
    }
    

1 个答案:

答案 0 :(得分:1)

是的,按顺序排列:

  • 您似乎不会将singleton pattern用于单例用例。
  • 你原来的问题与Qt没什么关系。
  • 这与静态库的区别几乎没有任何关系。
  • 您可以让插件接口接受记录器变换器,以便您可以使用应用程序中的实例进行设置。

我个人只是正确使用单例模式,插件也可以查询实例。请看下面的Qt宏:

  

Q_GLOBAL_STATIC( Type, VariableName)

     

创建一个名为VariableName的QGlobalStatic类型的全局和静态对象,其行为是指向Type的指针。 Q_GLOBAL_STATIC创建的对象在第一次使用时初始化,这意味着它不会增加应用程序或库的加载时间。此外,该对象在所有平台上以线程安全的方式初始化。

您可以轻松地在其上构建单例模式,实际上这甚至是线程安全的。

在这里,您可以找到另一个不使用Q_GLOBAL_STATICQObject继承的示例,并通过我们在项目中实现的QCoreApplication来促进工作。

https://projects.kde.org/projects/playground/games/gluon/repository/revisions/master/entry/core/singleton.h

上面这个版本也是线程安全的。