Visual c++ 致命错误LNK1179:无效或损坏的文件:重复的COMDAT'_IID#u ixmldomi实施';

Visual c++ 致命错误LNK1179:无效或损坏的文件:重复的COMDAT'_IID#u ixmldomi实施';,visual-c++,visual-studio-2005,Visual C++,Visual Studio 2005,当我链接我的项目时,我遇到了一个错误 COMMUNICATION.obj:致命错误LNK1179:文件无效或损坏: 重复COMDAT'\u IID\u IXMLDOM实施' 问题的根源是什么?这是一个棘手的问题 问题是生成的符号太长,并且存在歧义: //... void MyVeryLongFunctionNameUnique_0(void); void MyVeryLongFunctionNameUnique_1(void); // ^^^^^^^^^^^^^^^^^^^^

当我链接我的项目时,我遇到了一个错误

COMMUNICATION.obj:致命错误LNK1179:文件无效或损坏: 重复COMDAT'\u IID\u IXMLDOM实施'

问题的根源是什么?这是一个棘手的问题

问题是生成的符号太长,并且存在歧义:

  //...
  void MyVeryLongFunctionNameUnique_0(void);
  void MyVeryLongFunctionNameUnique_1(void);
  //   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  //   (example max-symbol-length-seen-by-linker)
在这种情况下,链接器将这两个函数视为“相同”,因为使它们“唯一”的部分长于最大符号长度

至少在三种情况下会发生这种情况:

  • 您的符号名称“太长”,不能被认为是链接器独有的,但对于编译器来说可能还可以(例如,当您从许多嵌套模板展开时)
  • 你做了一些“欺骗”,它是无效的C++,它通过编译器,但是现在你有一个无效的代码> *.Obj/<代码>,它阻塞链接器。< /LI>
  • 您指定了重复的“未命名”类/结构,链接器无法解析它们
  • ==[更新]==,这不是你的错,这是编译器和/或链接器的内部问题(有关可能的解决方法,请参阅下文)

根据问题(以上),你可以“增加”你的符号长度(通过限制符号长度的减少),或者修正你的代码以使它有效(明确)C++。 Microsoft在以下位置(至少)描述了此错误:

注意:此最大符号长度可使用
/H
选项设置,请参阅:

  • 建议:检查命令行中是否使用了
    /H
    。如果是,则将其删除(不指定最大符号长度,它将默认为
    2047
    /H
    只能减少此长度,不能增加它)
但是,您可能是通过
/Gy
选项(功能级别链接)触发的,这可能是通过
/Z7
/Zi
/Zi
中的一个选项暗示的:

讨论此问题的一个MSDN线程是:

此线程表明,可能会使用“编译的无效C++代码”(您得到的是
*.obj
)触发此问题,但无效的-
*.obj
会阻塞链接器(此示例尝试将
main
用作函数和模板):

==[更新]===

我以前应该说这句话,因为我怀疑,但现在我有了更多的信息:这可能不是你的错,编译器和/或链接器中似乎存在触发此错误的问题。尽管事实上,在所有失败的关系中,唯一的共同点是你自己

回想一下,“上述清单”适用(可能是你的错)。然而,在“这不是你的错”的情况下,这是当前的运行列表(我相信这个列表不完整)

  • 您的
    *.ilk
    文件(中间链接文件)中存在内部错误/损坏。删除它并重建
  • 您已经为链接打开了
    /INCREMENTAL
    ,但不知何故,增量链接对您的项目不起作用,因此您应该将其关闭并重新生成(
    项目属性=>配置属性=>链接器=>常规=>启用增量链接
    [设置为“否”(
    /INCREMENTAL:No
    )]
  • “COMDAT折叠”的“优化”在您的使用中存在问题。您可以通过转到
    Proerties=>Configuration Properties=>Linker=>Optimization=>Enable-COMDAT-Folding
    ,将“删除冗余COMDAT”(
    /OPT:ICF
    )来“删除冗余COMDAT”
下面是一个有趣的帖子,来自一个家伙,他有时可以链接,有时不可以,通过注释输入/输出几行代码。问题不在于代码——他只是不能一致地链接,而且看起来编译器和/或链接器在一些模糊的用例下有一个内部问题:

非平凡网络搜索的其他观察结果:

  • 这个问题似乎并不罕见
  • 它似乎与某种形式的
    模板
    使用有关
  • 当“调试”版本没有这个问题时,其他人似乎在“发布”版本中看到了这个问题(但在许多情况下,在“调试”版本中也看到了这个问题)
  • 如果链接在一台机器上“失败”,它可能在另一台生成机器上“成功”(不确定原因,“干净生成”似乎没有效果)
  • 如果您注释了几行特别重要的代码,并完成了构建,并一直这样做,直到所有代码再次被取消注释,那么您的链接可能会成功(这似乎是可重复的)
  • 如果您在MSVC2008中遇到此错误,并且将代码移植到MSVC2010,您仍然会遇到此错误
===[向全世界的善良人民请愿]====

如果您对此错误有其他意见,请在下面列出(作为其他答案或此答案下面的评论)。我有一个类似的问题,这不是我的错,并且这些解决方法对我都不起作用(尽管在某些情况下,它们在其项目中似乎对其他人起作用)

我加了一笔赏金,因为这让我快发疯了

===[更新+2]===

(叹气),这里有更多的东西可以尝试(显然对其他人有用,但对我不起作用):

  • 这家伙改变了他的编译设置,它成功了(从线程开始):

    Project->Settings->C++选项卡,调试目录:内联函数扩展
    :从“
    None
    ”更改为“
    Only”\u内联

  • 上面的线程引用了另一个线程,该线程必须重新安装MSVC

  • 这可能与在可能不兼容的编译器和/或链接开关中链接具有“细微差异”的模块有关
    #include "MyClassA.hpp"
    #include "MyClassB.hpp"
    #include "MyClassC.hpp"
    #include "MyClassD.hpp"
    #include "MyMainBody.hpp"
    
    int main(int argc, char* argv[])
    {
      // Use a function template for the "main-body", 
      // implementation is "mostly-simple", instantiates 
      // some local "MyClass" instances, they reference 
      // each other, and do some initialization,
      // (~50 lines of code)
      //
      // !!! LNK1179 for `MyMainBody<>()`, mangled name is ~236 chars
      //
      return MyMainBody<MyClassA,MyClassB,MyClassC,MyClassD>(argc,argv);
    }
    
    //Added mvc 
    //The following #import imports MSO based on it's LIBID
    #import "libid:2DF8D04C-5BFA-101B-BDE5-00AA0044DE52" version("2.2") lcid("0") rename_namespace("Office") raw_interfaces_only named_guids
    using namespace Office;
    
    //The following #import imports Outoloks Object lib based on it's LIBID
    #import "libid:00062FFF-0000-0000-C000-000000000046" rename_namespace("Outlook") raw_interfaces_only named_guids 
    using namespace Outlook;
    
    //The following #import imports VS Command Bars based on it's LIBID
    //  #import "libid:1CBA492E-7263-47BB-87FE-639000619B15" version("8.0") lcid("0") raw_interfaces_only named_guids
    
    //The following #import imports DTE based on it's LIBID
    //  #import "libid:80cc9f66-e7d8-4ddd-85b6-d9e6cd0e93e2" version("8.0") lcid("0") raw_interfaces_only named_guids
    
    //The following #import imports DTE80 based on it's LIBID
    //  #import "libid:1A31287A-4D7D-413e-8E32-3B374931BD89" version("8.0") lcid("0") raw_interfaces_only named_guids
    
    #import <foo.tlb> rename_namespace("FOO") named_guids;
    #import <bar.tlb> rename_namespace("BAR") named_guids;
    
    namespace FOO {
        extern "C" __declspec(selectany) const GUID IID_IFOOBAR = {0};
    }
    
    namespace BAR {
        extern "C" __declspec(selectany) const GUID IID_IFOOBAR = {0};
    }