什么/其他/导致这个?

时间:2011-01-11 20:37:20

标签: c++ visual-studio-2010 msbuild

MFC Toolbox Library.lib(SimpleFileIO.obj) : error LNK2005: _wcsnlen already defined in libcmtd.lib(wcslen_s.obj)
fatal error LNK1169: one or more multiply defined symbols found

这让我疯了。通常情况下,如果作为其解决方案一部分的各种项目不同意使用哪个CRT(单线程,多线程,发布或调试),就会得到这个。但是,我现在已经讨论过这个问题大约500次了,他们都同意了。

背景:这是一个刚从VS 2008转换而来的VS 2010项目。

MFC工具箱Library.lib设置为使用/ MTd编译为静态库,目标.exe我尝试在此解决方案中编译。此外,这个正在转换的解决方案(VS 2008)已经编译了&正确链接!!!所以这并不是说两个.vcproj之间存在分歧 - 或者至少在转换之前没有。

此外,MFC工具箱库在另一个解决方案中被大约25个其他项目使用 - 在该解决方案(Master Build English)中,它编译和编译。在调试和发布目标中没有投诉的其他项目的链接。

我花了最后一小时来讨论这个目标项目(Cimex Header Viewer)的每个项目属性与Master Build English解决方案中的几个不同的目标exe项目 - 我找不到区别。它们似乎是相同的,除了它们的名称不同。

我已经尝试过做一个干净的&建立所有。我只是出于想法。

有没有人想过我还会调查什么?

我想我已经准备好开始咀嚼玻璃了。 :(

4 个答案:

答案 0 :(得分:3)

您可以检查以确保CRT库以正确的顺序链接

参考:http://support.microsoft.com/default.aspx?scid=kb;en-us;q148652

答案 1 :(得分:3)

每当我遇到这个问题并且我没有明确的线索时,我会使用/ VERBOSE选项进行链接(有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/wdsk6as6%28v=vs.80%29.aspx)。此选项的输出可能很大,但您将看到哪个目标文件导致哪个其他目标文件从哪个库包含在链接过程中。

我使用它的典型示例如下:

我想在静态链接的应用程序中完全否决C和C ++的内存分配功能(动态链接要困难得多)。我开始编写自己的malloc和free实现,然后在链接到C / C ++库之前链接这个对象文件。

当然,链接器抱怨一些符号(如malloc_nh或类似的东西)被多次定义。使用/ VERBOSE选项我可以发现有些目标文件使用了出现在Microsoft定义其malloc和free函数的同一目标文件中的其他函数。我只需要将这些添加到我的'覆盖'实现并重新链接。

答案 2 :(得分:1)

也许一个项目静态链接到MFC而另一个项目将它用作DLL?

答案 3 :(得分:0)

很抱歉浪费每个人的时间。你的回答是我一直在看的各种各样的事情,虽然我没有真正使用/ verbose选项,并且将来会考虑它。

然而,这个归结为这样一个事实,即VS 2010提供的CRT定义了函数 wcsnlen(),而2008年的CRT确实。所以我在我的MFC工具箱库中的一个.h文件中提供了一个wcsnlen()内联实现,这在我的任何大型(53个项目)解决方案“Master Build English”中的任何项目中都没有提到过。因此,尽管大师建造了&正确链接,它只是因为该53个子项目中的任何东西都没有调用该函数!

但是这个其他解决方案(Cimex Header Viewer)确实设法在简单文件IO部分或MFC工具箱中调用了一些东西,它调用了wcsnlen,这导致编译器在SimpleFileIO.obj中为它创建了一个定义,后者与2010 CRT&因此错误信息。

叹息......这是一个痛苦的事情,因为我正在考虑项目设置,认为这必须是罪魁祸首(因为我从2008年 - > 2010年转换项目)。但问题实际上是存在已定义符号的冲突,因为MS突然在其较新的CRT中为此功能提供了一个定义。

再次 - 抱歉浪费任何人的时间。希望其他人会发现这个Q& A的使用。 ;)