Visual c++ 致命错误LNK1179:无效或损坏的文件:重复的COMDAT'_IID#u ixmldomi实施';
当我链接我的项目时,我遇到了一个错误 COMMUNICATION.obj:致命错误LNK1179:文件无效或损坏: 重复COMDAT'\u IID\u IXMLDOM实施' 问题的根源是什么?这是一个棘手的问题 问题是生成的符号太长,并且存在歧义: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); // ^^^^^^^^^^^^^^^^^^^^
//...
void MyVeryLongFunctionNameUnique_0(void);
void MyVeryLongFunctionNameUnique_1(void);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// (example max-symbol-length-seen-by-linker)
在这种情况下,链接器将这两个函数视为“相同”,因为使它们“唯一”的部分长于最大符号长度
至少在三种情况下会发生这种情况:
- 您的符号名称“太长”,不能被认为是链接器独有的,但对于编译器来说可能还可以(例如,当您从许多嵌套模板展开时)
- 您指定了重复的“未命名”类/结构,链接器无法解析它们
- ==[更新]==,这不是你的错,这是编译器和/或链接器的内部问题(有关可能的解决方法,请参阅下文)
根据问题(以上),你可以“增加”你的符号长度(通过限制符号长度的减少),或者修正你的代码以使它有效(明确)C++。 Microsoft在以下位置(至少)描述了此错误:
/H
选项设置,请参阅:
- 建议:检查命令行中是否使用了
。如果是,则将其删除(不指定最大符号长度,它将默认为/H
,2047
只能减少此长度,不能增加它)/H
/Gy
选项(功能级别链接)触发的,这可能是通过/Z7
、/Zi
或/Zi
中的一个选项暗示的:
讨论此问题的一个MSDN线程是:
*.obj
)触发此问题,但无效的-*.obj
会阻塞链接器(此示例尝试将main
用作函数和模板):
- 您的
文件(中间链接文件)中存在内部错误/损坏。删除它并重建*.ilk
- 您已经为链接打开了
,但不知何故,增量链接对您的项目不起作用,因此您应该将其关闭并重新生成(/INCREMENTAL
[设置为“否”(项目属性=>配置属性=>链接器=>常规=>启用增量链接
)]/INCREMENTAL:No
- “COMDAT折叠”的“优化”在您的使用中存在问题。您可以通过转到
,将“删除冗余COMDAT”(Proerties=>Configuration Properties=>Linker=>Optimization=>Enable-COMDAT-Folding
)来“删除冗余COMDAT”/OPT:ICF
- 这个问题似乎并不罕见
- 它似乎与某种形式的
使用有关模板
- 当“调试”版本没有这个问题时,其他人似乎在“发布”版本中看到了这个问题(但在许多情况下,在“调试”版本中也看到了这个问题)
- 如果链接在一台机器上“失败”,它可能在另一台生成机器上“成功”(不确定原因,“干净生成”似乎没有效果)
- 如果您注释了几行特别重要的代码,并完成了构建,并一直这样做,直到所有代码再次被取消注释,那么您的链接可能会成功(这似乎是可重复的)
- 如果您在MSVC2008中遇到此错误,并且将代码移植到MSVC2010,您仍然会遇到此错误
- 这家伙改变了他的编译设置,它成功了(从线程开始):
:从“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}; }