我旁边的情况:我需要建立在独立的静态库,然后将与最终应用(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是不同的编译器和平台之间的安全和便携?
它没有工作,因为你管理的话,被击中的静态初始化顺序的悲剧 。
你不能移动你的代码初始化静态对象如雷贯耳翻译单元(你可以把它读作源文件),其中使用这些静态对象。 没有办法的办法,你做到了。 如果你想使用你正在使用初始化不是移动只声明您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。