有关LNK2005错误的求救。
我在DBConnect.h里实现了有关ADO数据库连接的一个类及其函数实现,
然后在工程项目中的其中一个 LoginDlg.cpp 中 #include "DBConnect.h"
一切没问题。可当要在另一个 WorkThread.cpp 中 #include "DBConnect.h" 时,就报以下错误。
--------------------Configuration: Remote - Win32 Release--------------------
Compiling...
WorkThread.cpp
f:\projects\3.omc\nowdo\aa_release\remote\msado15.tlh(407) : warning C4146: unary minus operator applied to unsigned type, result still unsigned
Linking...
WorkThread.obj : error LNK2005: "public: void __thiscall CSmartDatabase::DBInitialization(void)" (?DBInitialization@CSmartDatabase@@QAEXXZ) already defined in LoginDlg.obj
WorkThread.obj : error LNK2005: "public: void __thiscall CSmartDatabase::DBClose(void)" (?DBClose@CSmartDatabase@@QAEXXZ) already defined in LoginDlg.obj
WorkThread.obj : error LNK2005: "public: void __thiscall CSmartDatabase::DBSqlExecute(class CString,class CString)" (?DBSqlExecute@CSmartDatabase@@QAEXVCString@@0@Z) already defined in LoginDlg.obj
WorkThread.obj : error LNK2005: "public: void __thiscall CSmartDatabase::DBSqlExecuteActLog(class CString,class CString)" (?DBSqlExecuteActLog@CSmartDatabase@@QAEXVCString@@0@Z) already defined in LoginDlg.obj
../AA_Release/Remote.exe : fatal error LNK1169: one or more multiply defined symbols found
Error executing link.exe.
Remote.exe - 5 error(s), 1 warning(s)
-----------------------------------------------------------------------------
LoginDlg.cpp 与 WorkThread.cpp 都包含有以下头文件:
#include "stdafx.h"
#include "Remote.h"
#include "LoginDlg.h" // 或:#include "WorkThread.h"
#include "DBConnect.h"
查了一下 LNK2005 错误:
---------------------------------------------Visual C++ 概念:生成 C/C++ 程序
链接器工具错误 LNK2005
在对象中已定义符号
以修饰形式显示的给定 symbol 被多次定义。
可能的原因
不慎同时与单线程库和多线程库链接。确保应用程序项目文件只包括适当的库,并且任何第三方库已适当创建了单线程或多线程版本。
在也使用 /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 是引用的第一个库。
有关更多信息,请参见知识库文章:
Q148652,PRB: LNK2005 Errors When Link C Run-Time Libraries Are Linked Before MFC Libraries。
Q140440,FIX: Global Overloaded Delete Operator Causes LNK2005。
Q184235,PRB: LNK2005 Errors on New and Delete When Defining _ATL_MIN_CRT。
该错误之后为致命错误 LNK1169。
---------------------------------------------
请教应该如何解决才不会出现错误?
问题点数:20、回复次数:1Top
1 楼CMyMfc(星际人生:=E.F=FlyForEver)回复于 2005-06-03 19:12:15 得分 20
把类及其函数实现放在CPP中, 类的声明和函数声明放在.h文件中
并在.h文件的开头加上
#ifndef __XXX_H
#define __XXX_H
在.h文件的屁股上加上
#endifTop




