问题:在vs2005环境下编译调试时,遇到”Error 186error LNK2005: "struct _tagDrSvrConfig drcfg" (?drcfg@@3U_tagDrSvrConfig@@A) already defined in configcontroller.lib(ConfigPage.obj)configcontroller.lib“ 这样的报错。
通过查看MSDN,如下:
通过检查下面的可能原因进行修复
-
在也使用 /clr 时混合静态库和动态库。
-
该符号为封装函数(通过用 /Gy 编译创建),包含在多个文件中,但在各编译间已改变。重新编译所有包含symbol 的文件。
-
以不同的形式在不同库中的两个成员对象中定义了该符号,并且使用了这两个成员对象。
-
某个绝对符号被定义两次,而每次定义的值不同。
-
头文件声明并定义了变量。可能的解决方案包括:
-
在 .h 中声明变量:
extern BOOL MyBool;
,然后在 .c 或 .cpp 文件中向它分配:BOOL MyBool = FALSE;
。 -
将变量声明为 static。
-
将变量声明为 selectany。
-
-
当将 uuid.lib 与定义 GUID 的其他 .lib 文件(例如 oledb.lib 和 adsiid.lib)一起使用时。例如:
oledb.lib(oledb_i.obj) : error LNK2005: _IID_ITransactionObject already defined in uuid.lib(go7.obj)
若要修复,请将 /FORCE:MULTIPLE 添加到链接器命令行选项,并确保 uuid.lib 是引用的第一个库。
其中选项5为最接近的原因。
解决:把
struct _tagDrSvrConfig drcfg的定义放在CPP文件中(原来是放在.h文件上定义),通过externstruct _tagDrSvrConfig drcfg声明,可以在当前文件中使用。
总结:
全局变量是针对整个工程的。正确的应该是在一个CPP文件中定义如下:int g_Test;那么在使用的CPP文件中就应该使用:extern int g_Test即可