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

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

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

这是我的类(class):

Factory.h中(静态库项目的一部分)

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

在某些 cpp 中,比如说 Circle.cpp (仍然是静态库项目的一部分)

static DummyClass dum;

ma​​in.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"),但这给出了有关符号无法识别的链接器错误。 (而且这在 GCC 中不起作用,但可能 --whole-archive 在那里工作)。

Visual Studio 链接器设置中有一个标志,允许单独链接所有对象文件而不是静态库,但我不想走这条路。另外,最好我只想在我想自动注册的每个单独类的源代码(.cpp)中编写一些内容,所有样板代码和宏都位于中央 header 中,例如 BaseFactory.h 等。有没有如何做到这一点(即使在 C++ 11 中也保证符号将被初始化)?希望让任何新开发人员都能尽可能轻松地注册新类。

最佳答案

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

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

这样,每当链接器运行时,它都会在可执行文件或 DLL 中强制链接 _dum

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

关于c++ - 如何在 C++ 中强制包含静态库中的静态对象 (MSVC 11),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39336778/

相关文章:

c++ - 用作模板参数的类的成员函数中的奇怪静态转换行为

visual-studio-2012 - 其他用户 check out 在Source Control Explorer(TFS Express)中不可见

编译错误_atoid

GITHUB 正在 push 旧凭证而不是新凭证的更改

java - Java中静态 block 的执行

c++ - C++类中的静态常量成员

linux - Qt4 静态编译和奇怪的错误发生在它们甚至不应该存在之前

c++ - 5 对角矩阵和 for 循环

c++ - open()返回结果码的区别: 25 vs 3?

c++ - 在静态库中存储线程 ID 的正确方法