1

我正在QTextCodec一个静态库中实现 Qt 框架。为了让我的编解码器实现注册到QTextCodec::codecForMib(int)and QTextCodec::codecForName(const char *),必须发生一些事情:

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

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

但是,我宁愿在静态库中拥有全局实例,因此链接到它的应用程序不需要自己做跑腿工作。但是我不知道如何在没有应用程序引用的情况下在静态库中初始化一个类实例

除非我在我的应用程序中引用,否则既不QMyTextCodec x也不QMyTextCodec *x = new QMyTextCodec实际初始化类的实例。x

4

1 回答 1

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);
于 2013-04-17T05:47:12.960 回答