首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在静态库中全局初始化类实例

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

Stack Overflow用户
提问于 2013-04-17 05:24:06
回答 1查看 623关注 0票数 2

我正在静态库中实现Qt框架的QTextCodec。为了使编解码器的实现在QTextCodec::codecForMib(int)QTextCodec::codecForName(const char *)中注册,必须发生以下几件事情:

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

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

但是,我更希望静态库中有全局实例,这样链接到静态库的应用程序就不需要自己动手了。,但我不知道如何在没有引用的应用程序的情况下在静态库中初始化类实例。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-17 05:47:12

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

代码语言:javascript
复制
#pragma comment(linker, "/INCLUDE:variable_name")

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

Init.cpp

代码语言:javascript
复制
QMyTextCodec initvariable;

MainHeader.h

代码语言:javascript
复制
#pragma comment(linker, "/INCLUDE:?initvariable@@3VQMyTextCodec@@A")

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

ExternalProjectMain.cpp

代码语言:javascript
复制
#include "staticlib/MainHeader.h"
#include "something.h"
...
...

注意:如果符号名不正确,您将得到一个未解决的链接器错误。

-

根据GCC文档,您可以使用__attribute__关键字完成类似的影响。我没有GCC的安装方便,但测试。

代码语言:javascript
复制
QMyTextCodec initvariable __attribute__(externally_visible);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16052153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档