初始化QT资源嵌入到静态库(Initializing qt resources embedded i

2019-08-04 06:02发布

我旁边的情况:我需要建立在独立的静态库,然后将与最终应用(VISUAL C ++ 9.0,QT 4.5)链接部件。 这种静态的部件库中含有一些资源(图标),并包括的几个.cpp文件(每个包含独立的部件)。 据我知道,我必须初始化QT资源系统,如果我在静态库中使用它们(资源),以调用“Q_INIT_RESOURCE(resource_file_name)”。 我解决了这个用下面的代码(在静态库中的每个.cpp文件):


#include <QAbstractButton>

namespace {
struct StaticLibInitializer
{
    StaticLibInitializer()
    {
        Q_INIT_RESOURCE(qtwidgets_custom_resources);
    }
};
StaticLibInitializer staticLibInitializer;
} 

// ... widget code ....

而不是我的第一个方法,我已经在初始化代码静态库项目(以避免包括在每个.cpp文件初始化代码)创建单独的init.cpp文件,但这并没有工作。

为什么这个没有工作?

这是方法与StaticLibInitializer是不同的编译器和平台之间的安全和便携?

Answer 1:

它没有工作,因为你管理的话,被击中的静态初始化顺序的悲剧 。

你不能移动你的代码初始化静态对象如雷贯耳翻译单元(你可以把它读作源文件),其中使用这些静态对象。 没有办法的办法,你做到了。 如果你想使用你正在使用初始化不是移动只声明您init.hpp头,但离开这些instatiations静态对象的方案StaticLibInitializer staticLibInitializer; 在使用静态对象的每个文件。
上述建议假定每个插件只使用自己的资源。 如果你有其中一个窗口小部件的资源被其他窗口使用的情况下,你碰上静态初始化顺序的悲剧一次。 您可以通过使用这样的代码管理这种情况

StaticLibInitializer
{
    void initialize()
    {
        static Q_INIT_RESOURCE(qtwidgets_custom_resources);
    }

    StaticLibInitializer()
    {
         initialize();
    }
}

使StaticLibInitializer的肯定乘法实例只会初始化一次给定的资源,然后实例StaticLibInitializer为您将要在给定的翻译单位要利用一切资源。



Answer 2:

该Q_INIT_RESOURCE宏无法在命名空间中使用。

让我从QT手动引用:“请注意:此宏无法在命名空间中使用,这应该主要被称为()”。 即使它给你一个例子,如何做是正确的,如果这是不可能的:

  inline void initMyResource() { Q_INIT_RESOURCE(myapp); }

    namespace MyNamespace
    {
     ...

     void myFunction()
     {
         initMyResource();
     }
  }

请看看你自己是为什么以及如何准确失败,或者如果您在未指定的方式来使用它不会失败。 相关的代码是在QtCore。



文章来源: Initializing qt resources embedded in static library