我的配置包含库和控制台应用程序。他们目前非常准确。我正在使用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是否试图通过延迟加载库中的链接静态变量来帮助我?或者我设置了一些编译器设置?这种行为完全出乎我意料。
答案 0 :(得分:2)
是"库文件"最终可执行文件的一部分。如果是的话 静态链接库中的目标文件,它只是部分 最终可执行文件,如果它解决了其他未解决的问题 外部符号。 (这是图书馆的定义。)如果你 从不在目标文件中使用任何符号,它不会成为其中的一部分 您的可执行文件,就好像源文件不是其中的一部分 申请。
如果动态加载库,则情况会略有不同
不同; .dll
作为一个单元加载(而不是作为对象文件)
对象文件,所以它不是真正的库),但如果没有
未解决的符号,可通过加载DLL解决,
它也不会被装载。
您可能想要做的是链接目标文件,
和不对库。在Visual Studios中,这意味着
将所有资源放在同一个项目中。或者......你可以
将库链接为.dll
,然后使用显式加载它
LoadLibrary
。 (这就是我们为图书馆所做的事情
引用是因为它们具有静态对象的构造函数
注册自己。)