用VC++编译程序是出现下面的错误,有可能是什么原因呢,我也不可能把问题描述的很清楚,哪位经验丰富的大侠给我点提示。
Linking...
nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in libcpmtd.lib(delop.obj)
nafxcwd.lib(afxmem.obj) : warning LNK4006: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in libcpmtd.lib(delop.obj); second definition ignored
   Creating library Debug/ClientDLL.lib and object Debug/ClientDLL.exp
c:\winnt\system32\ClientDLL.dll : fatal error LNK1169: one or more multiply defined symbols found
Error executing link.exe.

解决方案 »

  1.   

    我在微软的MSDN中查到的关于你的出错的信息,希望对你有帮助在对象中已定义符号以修饰形式显示的给定 symbol 被多次定义。可能的原因 不慎同时与单线程库和多线程库链接。确保应用程序项目文件只包括适当的库,并且任何第三方库已适当创建了单线程或多线程版本。 
    该符号为封装函数(通过用 /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。
      

  2.   

    首先谢谢Dai_Weis()的帮助。
    我采用了一个个看了程序中引用的头文件,把他们分批部分注释掉的方法,发现把afxwin.h头文件注释掉后,编译连接就通过了。然后我继续在MSDN中查找问题所在,发现有个问题是,当afxwin.h和istream这样的头文件一起使用时,会出错。这样我就有点明白了,我在程序中用到了string头文件中定义的模板类,在string头文件中包含有istream头文件,所以我的程序编译会有问题,但是我的程序中必须使用string头文件,我也不知道把afxwin.h去掉后会有什么后果,怎么办呢?
    哪位大侠再帮我出出主意啊,谢谢了。
      

  3.   

    问题解决了,采取了两个措施:
    1,在VC++项目设置中选择在共享DLL中使用MFC选项。
    2,将用到的一个基于STL开发的类的头文件的引用放在所有#include语句的最前面。体会:1,STL的使用还是要小心。
          2,虽然没用到MFC类,但是仍然要选择在共享DLL中使用MFC,我想可能是选择了该选项,会生成相应的编译开关吧。惭愧,其实还是不明白问题的根本所在,不知道采用了上面的两个步骤后,VC++在编译时究竟做了那些工作。如果哪位大侠能够给我好好解释解释就好了,或者指点我到什么地方能够学习这方面的知识。小弟将不胜感激!