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

如何在C+中强制包含静态库中的静态对象+;(MSVC 11) 我试图在C++文件中初始化一个静态对象,它试图在其构造函数中自动登记一个类到一个工厂(像任何标准的自动注册问题)。问题是,它被编译到一个静态库,当链接到一个可执行文件时,它被优化掉了。应该有一个非常简单的解决方案,但令人惊讶的是,看起来并不是那么简单,c++,visual-studio-2012,static,linker,static-linking,C++,Visual Studio 2012,Static,Linker,Static Linking,这是我的班级: 在Factory.h中(静态库项目的一部分) main.cpp(可执行文件的一部分) 现在,由于静态对象在可执行项目中没有“直接”使用,因此从链接库中跳过了它 我想让它在MSVC11(VisualStudio2012)(和GCC4.8.*中工作,但这是为了以后)。针对其他问题,我尝试了各种方法,但似乎都不起作用: 看起来只有Visual Studio支持/wholerchive链接器选项 Studio 2015(我们使用的是VS 2012) 指定/OPT:NOREF应该是有效的(

这是我的班级:

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

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

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

我想让它在MSVC11(VisualStudio2012)(和GCC4.8.*中工作,但这是为了以后)。针对其他问题,我尝试了各种方法,但似乎都不起作用:

  • 看起来只有Visual Studio支持/wholerchive链接器选项 Studio 2015(我们使用的是VS 2012)
  • 指定/OPT:NOREF应该是有效的(我尝试了几种与其他标志(如/OPT:NOICF)的组合),但对任何人都不起作用
  • 我在头文件中尝试了#pragma comment(linker,“/include:symbolName”),但这会导致链接器出现无法识别符号的错误。(这在GCC中也不起作用,但很可能——整个归档都在那里工作)
    VisualStudio链接器设置中有一个标志,允许单独链接所有对象文件,而不是静态库,但我不想这样做。另外,我最好只想在每个我想要自动登记的类中,在源代码(.CPP)中写入一些东西,所有锅炉板代码和宏都在一个中心的头中,比如BasePrime.h等等。有没有办法做到这一点(即使C++中有符号被初始化的保证11)?希望使任何新开发人员都能尽可能轻松地注册新类。

    在MSVC中,您有一个链接器pragma,可用于此目的:

    #pragma comment (linker, "/export:_dum")
    
    这样,每当链接器运行时,它都会强制在可执行文件或DLL中链接
    \u dum


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

    这可能与此相关:为什么您的
    dum
    对象是静态的?我想删除
    static
    关键字可以解决您的问题。通过将对象设置为静态,只有Circle.cpp可以访问此变量。您好,我已经尝试过了。因为这在可执行项目中没有直接引用,所以静态和全局都被删除。我可以创建一个访问器函数,并在main.cop文件中调用它,这会导致它的创建,但我真的不想这样做,因为在那里不需要它(只需要它注册到的类)。@JesperJuhl:我认为不需要。对我来说,静态对象甚至没有创建,因为它在静态库中,并且在可执行项目中没有直接引用。@JesperJuhl:不,这是一个排序问题,但只有在创建了两个相关对象时才会发生。这是一个单一的对象,而不是两个,它甚至没有被创建。
    static DummyClass dum;
    
    //some code accessing the BaseFactoryClass of the Registered derived classes. 
    
    #pragma comment (linker, "/export:_dum")