我采用"Use MFC in a shared DLL"编译可以顺利通过,但是,采用"Use MFC in a static Library"时,显示如下错误:
Linking...
nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in msvcrtd.lib(MSVCRTD.dll)
nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in msvcrtd.lib(MSVCRTD.dll)
libcmtd.lib(dbgheap.obj) : error LNK2005: _malloc already defined in msvcrtd.lib(MSVCRTD.dll)
libcmtd.lib(crt0dat.obj) : error LNK2005: _exit already defined in msvcrtd.lib(MSVCRTD.dll)
libcmtd.lib(crt0dat.obj) : error LNK2005: __exit already defined in msvcrtd.lib(MSVCRTD.dll)
libcmtd.lib(atox.obj) : error LNK2005: _atoi already defined in msvcrtd.lib(MSVCRTD.dll)
libcmtd.lib(strcat.obj) : error LNK2005: _strcpy already defined in msvcrtd.lib(MSVCRTD.dll)
libcmtd.lib(crt0init.obj) : error LNK2005: ___xc_z already defined in msvcrtd.lib(cinitexe.obj)
libcmtd.lib(crt0init.obj) : error LNK2005: ___xc_a already defined in msvcrtd.lib(cinitexe.obj)
libcmtd.lib(crt0init.obj) : error LNK2005: ___xi_z already defined in msvcrtd.lib(cinitexe.obj)
libcmtd.lib(crt0init.obj) : error LNK2005: ___xi_a already defined in msvcrtd.lib(cinitexe.obj)
libcmtd.lib(winxfltr.obj) : error LNK2005: __XcptFilter already defined in msvcrtd.lib(MSVCRTD.dll)
LINK : warning LNK4098: defaultlib "libcmtd.lib" conflicts with use of other libs; use /NODEFAULTLIB:library
LINK : warning LNK4098: defaultlib "LIBCMT" conflicts with use of other libs; use /NODEFAULTLIB:library
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
release/motionv1.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.motionv1.exe - 14 error(s), 2 warning(s)不知如何解决?急!!

解决方案 »

  1.   

    你是不是在你的程序当中包含了nafxcwd.lib库文件,然后在编译的时候你在link里面又加上了静态连接nafxcwd.lib库文件,造成了nafxcwd.lib库文件中函数的重定义,去掉其中的一个应该就没有问题了
    或者你采用条件编译也可以
      

  2.   

    把nafxcwd.lib从LINK中去除,因为nafxcwd.lib是系统自动编译的缺省库。也可考虑用命令 /nodefaultlib:"nafxcwd.lib" 从缺省库中去除,但是VC好象比较依赖这个库。
    另外一个办法就是设置 /force的编译参数。因为重复编译有时是可以接受的,使用/FORCE参数后,这些ERROR会变成WARNING ;-)