Windows错误LNK1179 我在Windows VS 2005编译了一个EXE,一个C++程序,链接到我的其他库。 它编译了,但突然没有,错误为LNK1170 COMDAT“
我不明白发生了什么事以及如何解决这个问题Windows错误LNK1179 我在Windows VS 2005编译了一个EXE,一个C++程序,链接到我的其他库。 它编译了,但突然没有,错误为LNK1170 COMDAT“,windows,linker-errors,Windows,Linker Errors,我不明白发生了什么事以及如何解决这个问题 谢谢无论如何,请查看有关它的官方文档: 如果你检查一下,一个家伙找到了另一种解决类似于你的问题的方法: 项目->设置->C++选项卡,调试目录:内联函数扩展:从“无”更改为“仅内联” 无论如何,请查看有关它的官方文档: 如果你检查一下,一个家伙找到了另一种解决类似于你的问题的方法: 项目->设置->C++选项卡,调试目录:内联函数扩展:从“无”更改为“仅内联” 这是从 链接器工具错误LNK1179 Visual Studio 6.0 无效或损坏
谢谢无论如何,请查看有关它的官方文档: 如果你检查一下,一个家伙找到了另一种解决类似于你的问题的方法: 项目->设置->C++选项卡,调试目录:内联函数扩展:从“无”更改为“仅内联”
无论如何,请查看有关它的官方文档: 如果你检查一下,一个家伙找到了另一种解决类似于你的问题的方法: 项目->设置->C++选项卡,调试目录:内联函数扩展:从“无”更改为“仅内联” 这是从
链接器工具错误LNK1179 Visual Studio 6.0 无效或损坏的文件:comdat comdat重复 包含两个或多个同名COMDAT的对象模块 一个可能的原因是,如果将/H选项与/Gy一起使用,/H选项限制外部名称的长度,/Gy选项包在COMDATs中起作用 例如,如果使用/Gy和/H8编译以下内容,则会出现错误LNK1179,因为对象模块将包含两个同名的COMDAT(function1和function2在九个字符处是唯一的): 这是从
链接器工具错误LNK1179 Visual Studio 6.0 无效或损坏的文件:comdat comdat重复 包含两个或多个同名COMDAT的对象模块 一个可能的原因是,如果将/H选项与/Gy一起使用,/H选项限制外部名称的长度,/Gy选项包在COMDATs中起作用 例如,如果使用/Gy和/H8编译以下内容,则会出现错误LNK1179,因为对象模块将包含两个同名的COMDAT(function1和function2在九个字符处是唯一的):
我重新启动了IDE,也重新启动了机器,但没有任何帮助。我在清理并重新编译(不是重新编译选项)后设法解决了这个问题我的2个libs。我不明白为什么它有帮助,但它成功地锁定了项目。我再次启动了IDE,也重新启动了机器,但没有帮助。我在清理和重新编译后设法解决了它(不是重新编译选项)我的2个libs。我不明白为什么它有帮助,但它成功地锁定了项目。关于这个bug有很多问题,包括:
- 使用未命名的内容(结构、类、命名空间)
- 模板参数的实例化
- 增量链接
template < class InputIterator >
Id findOrInsertSomething( const std::string & name, InputIterator begin, InputIterator end )
{
Id out;
{
static std::string sql( calculateQueryA() );
if (findSomething( sql, name, out ))
return out;
}
static std::string sql( calculateQueryB() );
out = insertSomehing( sql, name, begin, end );
return out;
}
什么可以比2047个字符长?因为类似于块签名的东西位于末尾,它将位于2047边界之后,这使得链接器的sql
变量实际上是相同的
解决方案很简单:
- 使用不同的名称
- 在函数中隐藏优化(不会为模板的每个版本计算)
与此缺陷有关的问题很多,包括:
- 使用未命名的内容(结构、类、命名空间)
- 模板参数的实例化
- 增量链接
我在这种情况下遇到了错误:
template < class InputIterator >
Id findOrInsertSomething( const std::string & name, InputIterator begin, InputIterator end )
{
Id out;
{
static std::string sql( calculateQueryA() );
if (findSomething( sql, name, out ))
return out;
}
static std::string sql( calculateQueryB() );
out = insertSomehing( sql, name, begin, end );
return out;
}
什么可以比2047个字符长?因为类似于块签名的东西位于末尾,它将位于2047边界之后,这使得链接器的sql
变量实际上是相同的
解决方案很简单:
- 使用不同的名称
- 在函数中隐藏优化(不会为模板的每个版本计算)
在绑定成员函数时遇到此问题:
std::function<void(Appender<Contact>&)> f = std::bind(&Manager::AppendContacts, this, std::placeholders::_1);
错误是:
LNK1179: invalid or corrupt file: duplicate COMDAT (...)
成员函数似乎与f
具有完全相同的签名(或者可能超过链接器检查的最大限制)
如果我改为内联编写,没有中间f
,则不会出现错误
gBuf.append(std::bind(&Manager::AppendContacts, this, std::placeholders::_1));
我不想假装理解这里发生了什么,但也许我可以节省一些人几个小时来解决这个问题,就像我不得不…在绑定成员函数时遇到了这个问题:
std::function<void(Appender<Contact>&)> f = std::bind(&Manager::AppendContacts, this, std::placeholders::_1);
错误是:
LNK1179: invalid or corrupt file: duplicate COMDAT (...)
成员函数似乎与f
具有完全相同的签名(或者可能超过链接器检查的最大限制)
如果我改为内联编写,没有中间f
,则不会出现错误
gBuf.append(std::bind(&Manager::AppendContacts, this, std::placeholders::_1));
我不想假装理解这里发生了什么,但也许我可以节省一些人几个小时来解决这个问题,就像我不得不…是的,我看到了,谢谢,我检查了comiple和link的命令,但我没有标记,我重新启动了IDE并重新启动。我在清理和comiple之后设法解决了这个问题(不是重新编译选项)我的2个libs。我不明白为什么会有帮助。最糟糕的bug是那些自己修复的bug。它们总是会回来!是的,我看到了,谢谢,我检查了comiple和link的命令,但我没有标记,我重新启动IDE并重新启动。我在清理和comiple之后设法解决了它(不是重新编译选项)我的两个libs。我不明白为什么它会有帮助。最糟糕的bug是那些自己修复的bug。它们总是会回来!@Roman我无法重现你描述的行为。这些是我从Google获得的一些结果!@Roman我无法重现你描述的行为。这些是我从Google获得的一些结果惯性导航与制导!