在Windows C ++下的链接库中的静态初始化

我有一个configuration有一个库和一个控制台应用程序。 他们现在是相当的准系统。 我正在使用Visual Studio 2010,库和控制台应用程序都静态链接到运行时。 控制台应用程序也链接到库。

在库中,我可以将这些代码添加到源文件中:

class MyClass { public: MyClass() { printf("MyClass loaded\n"); } }; class MyClass2 { public: static MyClass my_class; }; MyClass MyClass2::my_class; 

现在,我的理解是my_class应该在main()之前的某个时候初始化。 然而,它从来没有发生(因为我没有得到打印的消息)。

但是,我可以使用两种不同的方法来初始化它:

  1. 将代码放在控制台应用程序中。 这样做会调用printf()语句。
  2. 修改MyClass2以包含从库中的全局variables调用的静态函数,并在控制台应用程序的main()中使用该全局variables。

上面#2的例子:

库文件:

 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是否试图通过延迟加载链接到库的静态variables来帮助我? 或者有一些我设置的编译器设置? 这种行为对我来说是完全意外的。

是最终可执行文件的“库文件”部分。 如果它是一个静态链接库中的目标文件,它将只是最终可执行文件的一部分,如果它解决了一个否则无法解析的外部符号。 (这是一个库的定义。)如果你从来没有在目标文件中使用任何符号,它将不会是你的可执行文件的一部分,就好像源文件不是应用程序的一部分。

如果库是动态加载的,情况稍有不同; .dll作为一个单元加载(而不是目标文件的目标文件,所以它不是一个真正的库),但是如果没有未解决的符号将通过加载DLL来解决,它将不会被加载。

你可能想要做的是链接对象文件,而不是对库。 在Visual Studios中,这意味着将所有的来源放在同一个项目中。 或者…您可以将库链接为.dll ,然后使用LoadLibrary显式加载它。 (这是我们为图书馆所做的工作,因为他们有自己注册的静态对象的构造函数。