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