我有下一个情况:我需要在独立的静态库,其然后将与最终应用被链接插件创建(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 ....

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

为什么这次没工作?

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

有帮助吗?

解决方案

但它没有工作,因为你设法得到由静态初始化顺序打惨败

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

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

    StaticLibInitializer()
    {
         initialize();
    }
}

使StaticLibInitializer的确保乘实例将初始化给定的资源只有一次,然后实例StaticLibInitializer你要使用在给定的翻译单元的每一个资源。

其他提示

在Q_INIT_RESOURCE宏不能在一个命名空间中使用。

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

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

    namespace MyNamespace
    {
     ...

     void myFunction()
     {
         initMyResource();
     }
  }

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top