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

时间:2016-09-05 19:43:14

标签: c++ visual-studio-2012 static linker static-linking

我正在尝试初始化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”),但这会导致链接器出现无法识别符号的错误。 (而且这也不适用于海湾合作委员会,但可能 - 整个档案在那里工作)。
  4. Visual Studio链接器设置中有一个标志,允许单独链接所有目标文件而不是静态库,但我不想走那条路。另外,我最好只想在我想要自动注册的每个类的源(.cpp)中写一些东西,所有的样板代码和宏都在像BaseFactory.h这样的中心标题中。有没有这样做的方法(即使在C ++ 11中,保证符号将被初始化)?想要为任何新开发者尽可能简单地注册新课程。

1 个答案:

答案 0 :(得分:0)

在MSVC中,您可以使用链接器编译指示来实现此目的:

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

通过这种方式,只要运行链接程序,它将强制链接_dum在您的可执行文件或DLL中。

不过,更好的方法是考虑使用DLL而不是静态库。这样一来,您就完全避免了这个问题,因为在DLL的每次加载时,都会初始化静态变量。

相关问题