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获得的一些结果惯性导航与制导!