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

时间:2014-04-15 08:48:07

标签: c++ windows visual-studio-2010 static initialization

我的配置包含库和控制台应用程序。他们目前非常准确。我正在使用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以包含从库中的全局变量调用的静态函数,并在控制台应用程序的main()中使用该全局变量。
  3. 以上#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是否试图通过延迟加载库中的链接静态变量来帮助我?或者我设置了一些编译器设置?这种行为完全出乎我意料。

1 个答案:

答案 0 :(得分:2)

是"库文件"最终可执行文件的一部分。如果是的话 静态链接库中的目标文件,它只是部分 最终可执行文件,如果它解决了其他未解决的问题 外部符号。 (这是图书馆的定义。)如果你 从不在目标文件中使用任何符号,它不会成为其中的一部分 您的可执行文件,就好像源文件不是其中的一部分 申请。

如果动态加载库,则情况会略有不同 不同; .dll作为一个单元加载(而不是作为对象文件) 对象文件,所以它不是真正的库),但如果没有 未解决的符号,可通过加载DLL解决, 它也不会被装载。

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