我有一个问题:我需要在独立的静态库中创建小部件(widget),然后将其与最终应用程序(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 ....
这段代码包含一个命名空间和一个结构体。命名空间被用于将变量和函数放在独立的作用域内,以防止名称冲突。结构体被称为“静态库初始化器”,它在创建时会调用函数`Q_INIT_RESOURCE(qtwidgets_custom_resources)`来初始化静态库。在代码下方还有一些注释,暗示了这段代码中可能涉及的控件部分,但是具体细节需要查看其他地方的代码。
我最初的方法是在静态库项目中创建了一个单独的init.cpp文件,其中包含初始化代码(以避免在每个.cpp文件中都包含初始化代码),但这种方法失败了。
为什么这种方法行不通?
使用StaticLibInitializer的这种方法在各种编译器和平台上是否安全可靠?