我有一个用VS2008 C++编写的应用程序,它已经正确工作了很长一段时间。它由几个静态库项目组成,这些项目都链接到一个.exe中。
在一些维护过程中,我在一个静态库项目中添加了一个额外的# .cpp文件,导致exe (一个单独的项目)拒绝链接。如果我删除了违规的#include (并尝试重新考虑维护更改),那么问题就解决了,但是很明显,有些地方不太正确,我需要了解它的真相。
链接错误是:
Error 3 error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj) nafxcwd.lib
Error 4 error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj) nafxcwd.lib
Error 5 error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) already defined in LIBCMTD.lib(delete2.obj) nafxcwd.lib
Error 6 fatal error LNK1169: one or more multiply defined symbols found Tmtka.exe 1
这通常指向各种.lib和可执行文件所使用的CRT库的版本(静态版本和动态版本)的不一致。但是,所有.lib和可执行文件都是使用"/MT“和”在静态库中使用MFC“构建的。
另一个难题是,当所有的.lib(s)和可执行文件一致地设置为"/MD“和”在共享DLL中使用MFC“时,问题就消失了。但是,由于理想情况下,我们希望继续尽可能地发布静态链接(自包含)应用程序,因此我们想弄清楚如何解决这个问题,同时继续使用"/MT“和”在静态库中使用MFC“。
没有使用明确的第三方库,但是VS2008很可能会链接到引擎盖下的一些可以动态链接到CRT或MFC的库,从而导致这个问题。但是,为什么在经过多年的成功运作之后,通过简单引入这个不幸的#include指令,这个问题才会在现在才显现出来?
可能是图书馆的排序问题吗?
“附加属地”中的明确库被排序,以至于那些依赖他人的图书馆首先出现,即使MSCV链接器据称没有像gcc所说的那样严重地避免出现问题。但我有一种感觉,如果这是一个间歇性的排序问题,它可能更多地与隐藏依赖项下的排序有关。
我怎么才能开始想办法解决这个问题?我该用什么工具?我尝试过depends.exe,但它似乎不想打开.lib文件(我试图确保理解它们的依赖关系)
请帮帮我..。
发布于 2015-04-08 09:57:52
我也遇到过同样的问题。当我用MFC静态链接编译我的项目时,出现了这个问题,并且我在我的项目中添加了另一个库,它也使用MFC静态链接。将预编译头的C++项目选项更改为/Yu (使用预编译标头的)具有魔力。
https://stackoverflow.com/questions/21441493
复制相似问题