初始化QT资源嵌入到静态库
-
21-09-2019 - |
题
我有下一个情况:我需要在独立的静态库,其然后将与最终应用被链接插件创建(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。