我正在静态库中实现Qt框架的QTextCodec。为了使编解码器的实现在QTextCodec::codecForMib(int)和QTextCodec::codecForName(const char *)中注册,必须发生以下几件事情:
这似乎是由于QTextCodec::QTextCodec()使用已知编解码器的字典注册实例。好吧。因此,如果我向我的应用程序添加一个全局变量(它与静态库链接),那么单元测试是成功的。
但是,我更希望静态库中有全局实例,这样链接到静态库的应用程序就不需要自己动手了。,但我不知道如何在没有引用的应用程序的情况下在静态库中初始化类实例。
QMyTextCodec x和QMyTextCodec *x = new QMyTextCodec实际上都没有初始化类的实例,除非我在应用程序中引用了x。
发布于 2013-04-17 05:47:12
您可以通过#pragma语句将选项传递给MSVC链接器,并使用‘/包括’选项强制它链接变量。
#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);https://stackoverflow.com/questions/16052153
复制相似问题