C++ 在Windows C++;

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

我有一个配置,它有一个库和一个控制台应用程序。他们目前是相当赤裸裸的。我使用的是VisualStudio2010,库和控制台应用程序都静态链接到运行时。控制台应用程序还链接到库

在库中,我可以在源文件中添加以下代码:

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

class MyClass2
{
public:
    static MyClass my_class;
};

MyClass MyClass2::my_class;
现在,我的理解是,我的_类应该在main()之前的某个点初始化。然而,它从未发生过(因为我没有收到打印的消息)

但是,我可以使用两种不同的方法对其进行初始化:

  • 将代码放在控制台应用程序中。这样做肯定会调用printf()语句
  • 修改MyClass2以包含从库中的全局变量调用的静态函数,并在控制台应用程序的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是否试图通过延迟加载链接库的静态变量来帮助我??还是我已经设置了一些编译器设置?这种行为完全出乎我的意料。

    是最终可执行文件的“库文件”部分。如果它是一个 静态链接库中的对象文件,它将仅是一部分 如果最终可执行文件解析了其他未解析的 外部符号。(这是库的定义。)如果 不要在对象文件中使用任何符号,它不会成为 你的可执行文件,就好像源文件不是 应用程序

    如果库是动态加载的,则情况会稍有不同 不同的;
    .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或类似的受害者,因为我现在再次尝试了它,它成功了(当然,头文件也被更新了,所以可能也是这样)。不管怎样,这个回答都是有道理的。谢谢