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

C++ 在动态库之间共享静态库中的数据,c++,qt,singleton,qtcore,C++,Qt,Singleton,Qtcore,我有下一个情况: A类的静态库;(记录器) 将类A实例创建为单例的主应用程序 不同的延迟加载动态库(插件),链接到(1.),需要使用类A的实例 如何在插件(3.)之间共享主应用程序(2.)的单例?Qt/C++中有什么特点吗?< /P> 目前我正在使用基于共享内存的丑陋解决方案,我认为这是不对的 我正在考虑使用依赖注入模式进行重构,但它有一些限制 样本: 静态库“log.lib”: 主应用程序“app.exe”: 插件1“plg1.dll” 插件2“plg2.dll” 对,所以顺序是: 您似乎没

我有下一个情况:

  • A类的静态库;(记录器)
  • 将类A实例创建为单例的主应用程序
  • 不同的延迟加载动态库(插件),链接到(1.),需要使用类A的实例
  • 如何在插件(3.)之间共享主应用程序(2.)的单例?Qt/C++中有什么特点吗?< /P> 目前我正在使用基于共享内存的丑陋解决方案,我认为这是不对的

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

    样本:

    静态库“log.lib”:

    主应用程序“app.exe”:

    插件1“plg1.dll”

    插件2“plg2.dll”

    对,所以顺序是:

    • 您似乎没有在单例用例中使用
    • 您最初的问题与Qt没有太大关系
    • 这与静态库的区别几乎无关
    • 您可以让插件接口接受一个记录器变量,这样您就可以使用应用程序中的实例来设置它
    我个人只需要正确使用singleton模式,插件也可以查询实例。请查看以下Qt宏:

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

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

    在这里,您可以找到另一个示例,它不是使用
    Q\u GLOBAL\u STATIC
    ,而是使用
    QObject
    继承,并使用我们在项目中实现的
    QCoreApplication
    简化工作


    上述版本也是线程安全的。

    不清楚您的要求,请粘贴一些代码。如果我正确理解了我不确定的内容,您可能希望从库中实例化singleton,可能是通过插件接口,但是您写的共享是什么。。。。我还不清楚它与静态使用库的关系。是的,您理解正确。但我不想通过库接口实例化logger,因为库之间有很多复杂的关系(共享/静态/延迟加载/混合情况)。太好了,谢谢。这解决了一切。另外,很抱歉英语不好,我正在努力学习;)
    struct Log
    {
      void write( QString text );
    };
    
    Log *logger = new Log; // I need only one logger for all application 
    
    int main()
    {
      logger->write( "Main" );
      ...
    }
    
    extern Log *logger; // Logger from "app.exe"
    void Foo()
    {
      logger->write( "Foo" );
    }
    
    extern Log *logger; // Logger from "app.exe"
    void Bar()
    {
      logger->write( "Bar" );
    }