我在头文件中定义了以下结构和结构对象,如下所示:
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/