c++ - 为什么报错LINK2005 : object already defined error disappears when I declare the object as static

标签 c++ windows static linker-errors

我在头文件中定义了以下结构和结构对象,如下所示:

struct STConfigurationDetails
{
    bool bAutoStart;
    bool bAutoLog;
    bool bAutoScan;
    bool bAutoMount;
    bool bAutoOpen;
    bool bAutoDetectLast;
};

struct STConfigurationDetails g_objConfigurationDetails ;

在自己的头文件中,我同时拥有使用 g_objConfigurationDetails 的方法和方法体。当我将头文件包含到另一个 cpp 文件并调用该方法时,这工作正常。但是当我将头文件添加到另一个 cpp 文件时,我得到了错误:

Error 1 error LNK2005: "struct STConfigurationDetails g_objConfigurationDetails" (?g_objConfigurationDetails@@3USTConfigurationDetails@@A) already defined in NDSClientDlg.obj NDSConnectDlg.obj NDSClient

Error 2 fatal error LNK1169: one or more multiply defined symbols found d:\FromClearCase\Development_view\NDS_11152010\exe\Debug\NDSClient.exe 1 NDSClient

在搜索了几个线程后,我发现我必须将我的对象声明为静态的,然后它就解决了。但是我想知道为什么在我仅在 te 头文件中创建实例时出现多实例错误。

这是因为我的头文件有一个全局变量并且它被包含在多个 CPP 中吗?

最佳答案

添加 static 可能会解决您的链接问题,但会给您带来更大的问题。该变量不再是全局变量,并且在使用它的每个 CPP 文件中都有不同的值。您需要在头文件中将其声明为 extern,然后在一个 CPP 文件中再声明一次。

当您使用 static 时,这意味着该变量将完全局限于当前 CPP 文件,不会暴露给其他文件。这就是为什么链接器不再关心另一个文件中是否有另一个具有相同名称的静态变量。它们不是同一个变量。

如果你想要一个真正的全局变量,它必须在一个 CPP 文件中声明,并且只有它的原型(prototype)(带有 extern)应该在一个头文件中,该头文件将与其他 CPP 文件共享。它就像函数一样——在一个文件中声明,为其余文件制作原型(prototype)。对于功能,您根本不提供主体。对于变量,您使用 extern

关于c++ - 为什么报错LINK2005 : object already defined error disappears when I declare the object as static,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4182866/

相关文章:

c++ - 生成下一个最大或最小的可表示 float ,无需位旋转

c++ - 由于查找 Windows.h 时出现问题,无法设置 openGL superBible 示例

java - 最终的、不可变的对象不是常量吗?

c++ - 从 demangled 名称中获取 mangled 名称

c++ - 有没有办法根据派生类的可能性值范围来限制对象参数?

c++ - 将 listS 用于顶点和边列表时无法调用 boost::clear_vertex

C++:单例?如何将参数传递给构造函数?

linux - 如何将符号链接(symbolic link)文件从 Linux 复制到 Windows,然后再复制回 Linux 但仍将其保留为符号链接(symbolic link)

c++ - 为什么 gdb 在 Windows 中这么慢?

java - 继承类的 protected 静态成员