我有一个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()之前的某个时候初始化。 然而,它从来没有发生(因为我没有得到打印的消息)。
但是,我可以使用两种不同的方法来初始化它:
上面#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
显式加载它。 (这是我们为图书馆所做的工作,因为他们有自己注册的静态对象的构造函数。