C++ 在Windows C++;
我有一个配置,它有一个库和一个控制台应用程序。他们目前是相当赤裸裸的。我使用的是VisualStudio2010,库和控制台应用程序都静态链接到运行时。控制台应用程序还链接到库 在库中,我可以在源文件中添加以下代码:C++ 在Windows C++;,c++,windows,visual-studio-2010,static,initialization,C++,Windows,Visual Studio 2010,Static,Initialization,我有一个配置,它有一个库和一个控制台应用程序。他们目前是相当赤裸裸的。我使用的是VisualStudio2010,库和控制台应用程序都静态链接到运行时。控制台应用程序还链接到库 在库中,我可以在源文件中添加以下代码: class MyClass { public: MyClass() { printf("MyClass loaded\n"); } }; class MyClass2 { public: static MyClass my_clas
class MyClass
{
public:
MyClass()
{
printf("MyClass loaded\n");
}
};
class MyClass2
{
public:
static MyClass my_class;
};
MyClass MyClass2::my_class;
现在,我的理解是,我的_类应该在main()之前的某个点初始化。然而,它从未发生过(因为我没有收到打印的消息)
但是,我可以使用两种不同的方法对其进行初始化:
class MyClass
{
public:
MyClass()
{
printf("MyClass loaded\n");
}
};
class MyClass2
{
public:
static MyClass my_class;
static int Ping();
};
MyClass MyClass2::my_class;
int my_global = MyClass2::Ping();
控制台应用程序文件:
extern int my_global;
int main()
{
printif("%d", my_global);
}
Windows是否试图通过延迟加载链接库的静态变量来帮助我??还是我已经设置了一些编译器设置?这种行为完全出乎我的意料。是最终可执行文件的“库文件”部分。如果它是一个
静态链接库中的对象文件,它将仅是一部分
如果最终可执行文件解析了其他未解析的
外部符号。(这是库的定义。)如果
不要在对象文件中使用任何符号,它不会成为
你的可执行文件,就好像源文件不是
应用程序
如果库是动态加载的,则情况会稍有不同
不同的;.dll
作为一个单元(而不是对象文件)加载
对象文件,因此它不是真正的库),但如果没有
通过加载DLL解析的未解析符号,
它也不会被加载
您可能要做的是针对对象文件进行链接,
而不是反对图书馆。在视觉工作室,这意味着
将所有源放在同一个项目中。或你可以
将库链接为.dll
,然后使用
加载库
。(这是我们为仅限于
引用,因为它们具有静态对象的构造函数
可能是在初始化
stdout
(它依赖于printf
)之前初始化了类?此外,您可能需要阅读。虽然它不是特定于Windows的,但它仍然足以让您走上正确的道路。在第一种情况下,您在库项目中定义了my\u class
,您是否也在console应用程序项目中使用my\u class
?如果没有,链接器可能会决定不在最终二进制文件中包含这些内容,因为它认为这不是必需的。另一个问题:库文件是库项目中的头文件还是cpp?看来我得到了答案。谢谢各位。回答问题:Joachim:我通过在main中使用exit(0)和printf()排除了这一点(对不起,我没有说)。谢谢你的链接。亚历山大:它在CPP文件中。正如詹姆斯在回答中指出的那样,我相信你的思路是正确的。@JoachimPileborg你确实提出了一个有趣的观点。C++标准为初始化代码< > STD::CUT(该示例几乎肯定会遇到)设置了某些要求,但是它没有提到关于代码的初始化。我曾经考虑过这一点,甚至试图“导出”一个随机整数,但没有成功。然而,我可能是PCH或类似的受害者,因为我现在再次尝试了它,它成功了(当然,头文件也被更新了,所以可能也是这样)。不管怎样,这个回答都是有道理的。谢谢