如何在C ++中强制包含静态库中的静态对象(MSVC 11)

问题描述 投票:0回答:1

我试图在C ++文件中初始化一个静态对象,该文件试图在其构造函数中将类自动注册到工厂(就像任何标准的自动注册问题一样)。问题是,这被编译为静态库,并且在链接到可执行文件时,它被优化掉了。应该有一个非常简单的解决方案,但令人惊讶的是,看起来并不那么简单。

这是我的班级:

在Factory.h(静态lib项目的一部分)

class DummyClass : public BaseFactoryClass
{
    int mDummyInt;
public:
    DummyClass()
    {
        std::cout << "Pretending to register myself to the factory here\n";
    }
};

在一些cpp中,让我们说Circle.cpp(仍然是静态lib项目的一部分)

static DummyClass dum;

main.cpp(可执行文件的一部分)

//some code accessing the BaseFactoryClass of the Registered derived classes. 

现在,由于静态对象没有在可执行项目中“直接”使用,因此它会从链接库中跳过。

我想让它在MS VC11(Visual Studio 2012)(以及GCC 4.8。*,但这是以后的)中工作。看看其他问题,我到目前为止尝试了各种各样的东西,似乎不起作用:

  1. 看起来/ WHOLEARCHIVE链接器选项仅支持Visual Studio 2015(我们使用的是VS 2012)
  2. 指定/ OPT:NOREF应该有效(我尝试了几种与其他标志如/ OPT:NOICF的组合),但它对任何人都不起作用。
  3. 我在头文件中尝试了#pragma comment(linker,“/ include:symbolName”),但这会导致链接器出现无法识别符号的错误。 (而且这也不适用于海湾合作委员会,但可能 - 整个档案在那里工作)。

Visual Studio链接器设置中有一个标志,允许单独链接所有目标文件而不是静态库,但我不想走那条路。另外,我最好只想在我想要自动注册的每个类的源(.cpp)中写一些东西,所有的样板代码和宏都在像BaseFactory.h这样的中心标题中。有没有这样做的方法(即使在C ++ 11中,保证符号将被初始化)?想要为任何新开发人员尽可能简单地注册新类。

c++ visual-studio-2012 static linker static-linking
1个回答
0
投票

在MSVC中,您有一个可用于此目的的链接程序编译指示:

#pragma comment (linker, "/export:_dum")

这样,无论何时运行链接器,它都会在您的可执行文件或DLL中强制链接_dum

但是,更好的方法是考虑使用DLL而不是静态库。然后你完全避免这个问题,因为每次加载DLL都会初始化静态变量。

© www.soinside.com 2019 - 2024. All rights reserved.