gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:50:14 25 4
gpt4 key购买 nike

我正在尝试在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com