关于"LNK2005"错误

来源:互联网 发布:软件安全性测试 csdn 编辑:程序博客网 时间:2024/06/05 22:40

问题:在vs2005环境下编译调试时,遇到”Error 186error LNK2005: "struct _tagDrSvrConfig drcfg" (?drcfg@@3U_tagDrSvrConfig@@A) already defined in configcontroller.lib(ConfigPage.obj)configcontroller.lib“ 这样的报错。

通过查看MSDN,如下:

通过检查下面的可能原因进行修复

  1. 在也使用 /clr 时混合静态库和动态库。

  2. 该符号为封装函数(通过用 /Gy 编译创建),包含在多个文件中,但在各编译间已改变。重新编译所有包含symbol 的文件。

  3. 以不同的形式在不同库中的两个成员对象中定义了该符号,并且使用了这两个成员对象。

  4. 某个绝对符号被定义两次,而每次定义的值不同。

  5. 头文件声明并定义了变量。可能的解决方案包括:

    • 在 .h 中声明变量:extern BOOL MyBool;,然后在 .c 或 .cpp 文件中向它分配:BOOL MyBool = FALSE;

    • 将变量声明为 static。

    • 将变量声明为 selectany。

  6. 当将 uuid.lib 与定义 GUID 的其他 .lib 文件(例如 oledb.lib 和 adsiid.lib)一起使用时。例如:

      
    oledb.lib(oledb_i.obj) : error LNK2005: _IID_ITransactionObjectalready 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即可

0 0
原创粉丝点击