在静态库中全局初始化类实例

时间:2013-04-17 05:24:07

标签: c++ visual-c++ static-libraries

我正在静态库中实现Qt框架的QTextCodec。为了使我的编解码器的实现能够在QTextCodec::codecForMib(int)QTextCodec::codecForName(const char *)中注册,必须做一些事情:

  • 必须初始化编解码器的实例(但不一定使用)。
  • 不得删除实例或超出范围。

这似乎是由于QTextCodec::QTextCodec()将实例注册到已知编解码器的字典。好的。因此,如果我将一个全局变量添加到我的应用程序(与静态库链接),单元测试就会成功。

但是,我宁愿在静态库中使用全局实例,因此链接到它的应用程序本身不需要自己动手。 但我无法弄清楚如何在没有引用它的应用程序的情况下在静态库中初始化类实例

QMyTextCodec xQMyTextCodec *x = new QMyTextCodec实际上都没有初始化类的实例,除非我在我的应用程序中引用x

1 个答案:

答案 0 :(得分:1)

您可以通过#pragma语句将选项传递给MSVC链接器,并使用`/include'选项强制它链接变量。

#pragma comment(linker, "/INCLUDE:variable_name")

如果使用/OPT:REF优化标志,这将覆盖该变量的删除。为了使#pragma语句起作用,它需要出现在链接到静态库的项目的至少一个翻译单元(源文件)中。这可以通过将其放在保证包含在项目中的头文件中来完成。您还需要考虑名称修饰,因为#pragma无法自动处理它。

Init.cpp

QMyTextCodec initvariable;

MainHeader.h

#pragma comment(linker, "/INCLUDE:?initvariable@@3VQMyTextCodec@@A")

然后在任何依赖静态库的项目中,只需包含MainHeader.h

ExternalProjectMain.cpp

#include "staticlib/MainHeader.h"
#include "something.h"
...
...

注意:如果符号名称不正确,您将收到未解析的链接器错误。

-

根据GCC文档,您可以使用__attribute__关键字实现类似的影响。 然而,我没有GCC安装来测试它。

QMyTextCodec initvariable __attribute__(externally_visible);