【问题标题】:Visual-C++ Linker ErrorVisual-C++ 链接器错误
【发布时间】:2009-08-08 14:03:24
【问题描述】:

我有一个名为 MODEL 的类,其中 public static int theMaxFrames 驻留。该类在其自己的头文件中定义。 theMaxFrames 由 MODEL 类中的一个类和一个函数 void set_up() 访问,该函数也在 MODEL 类中。 Render.cpp 源文件包含一个函数,该函数调用 Direct3D.cpp 源文件中的函数,该函数又通过 MODEL 对象调用 set_up() 函数。这是这两个源文件和 theMaxFrames 之间的唯一联系。

当我尝试编译我的代码时,我收到以下错误消息:

1>Direct3D.obj : error LNK2001: unresolved external symbol "public: static int MODEL::theMaxFrames" (?theMaxFrames@MODEL@@2HA)

1>Render.obj : error LNK2001: unresolved external symbol "public: static int MODEL::theMaxFrames" (?theMaxFrames@MODEL@@2HA)

1>C:\Users\Byron\Documents\Visual Studio 2008\Projects\xFileViewer\Debug\xFileViewer.exe : 致命错误 LNK1120: 1 unresolved externals

【问题讨论】:

    标签: c++ visual-c++ linker


    【解决方案1】:

    听起来很像你在课堂上声明了theMaxFrames,但你还没有为它提供定义。

    如果是这种情况,您需要在某个 .cpp 中为其提供定义。

    例如

    int MODEL::theMaxFrames;
    

    此问题有一个常见问题解答条目:static data members。

    【讨论】:

    • 谢谢!这解决了它。但我不确定为什么这是必要的,您能否提供一些急需的见解?
    • 这是语言要求。如果你在一个类中声明一个静态变量,那么你需要在类体之外的某个地方为其提供一个定义。
    • 因为头文件不包含变量分配。任何需要存在于可执行文件中的东西都需要在某个 CPP 文件中声明。标头是不同源文件之间提供东西的契约。源文件是满足标头中指定的合同的实现。如果您未能满足合同,则会导致链接器错误。
    • @BillyONeal:这不是关于变量分配,而是关于对类的static 数据成员进行有效定义。在类定义中任何static 数据成员的声明始终只是一个声明,而不是一个定义,无论类定义是否在头文件中。您需要在程序的某个翻译单元中定义static 数据成员。它在哪个源文件中无关紧要,它可能在头文件中(尽管如果头文件包含在程序中的多个翻译单元中,这会导致问题)。
    猜你喜欢
    • 2012-04-12
    • 2014-10-17
    • 2013-12-27
    • 1970-01-01
    • 2010-11-14
    • 2011-07-03
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    相关资源
    最近更新 更多