Ошибка Windows LNK1179 - PullRequest
       5

Ошибка Windows LNK1179

0 голосов
/ 20 декабря 2010

Я скомпилировал исполняемый файл для Windows VS 2005, программы на С ++, которая ссылается на другие мои библиотеки.Он скомпилирован и вдруг не с ошибкой LNK1170 COMDAT "

Я не могу понять, что случилось и как решить проблему.

Спасибо

Ответы [ 5 ]

2 голосов
/ 03 февраля 2011

Существует много проблем, связанных с этой ошибкой, включая:

  • использование неназванного материала (структура, класс, пространство имен)
  • создание экземпляра параметра шаблона
  • инкрементное связывание
  • ...

Я столкнулся с ошибкой в ​​такой ситуации:

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;
}

При использовании в коде произошла ошибка связи LNK1179.Проблема проста.Даже без ключа / H максимальная длина имен может составлять 2047 символов.При использовании материала шаблона обычно создаются очень длинные имена.В примере есть 2 статические переменные с одинаковыми именами.Они будут названы как:

sql?something-like-function-signature?something-like-block-signature

, что может быть длиннее 2047 символов.Поскольку something-like-block-signature находится в конце, он будет за границей 2047 года, что делает обе переменные sql одинаковыми для компоновщика.

Решение легко:

  • с использованием различныхимена
  • скрыть оптимизацию в функции (не будет рассчитываться для каждой версии шаблона)
1 голос
/ 20 декабря 2010

Это скопировано с http://msdn.microsoft.com/en-us/library/aa234469(VS.60).aspx


Ошибка инструментов компоновщика LNK1179

Visual Studio 6.0

неверный или поврежденный файл: дубликат comdat comdat

Объектный модуль содержал два или более COMDAT с одинаковым именем.

Одна из возможных причин - использование параметра / H с / Gy. Параметр / H ограничивает длину внешних имен, а параметр / Gy упаковывает функции в COMDAT.

Например, если вы скомпилируете следующее с помощью / Gy и / H8, вы получите ошибку LNK1179, поскольку объектный модуль будет содержать два COMDAT с одинаковыми именами (function1 и function2 уникальны и состоят из девяти символов):

void function1(void);
void function2(void);

void main(void) {
    function1();
    function2();
}

void function1(void) {}
void function2(void) {}
0 голосов
/ 09 февраля 2018

Испытывал эту проблему при привязке к функции-члену:

std::function<void(Appender<Contact>&)> f = std::bind(&Manager::AppendContacts, this, std::placeholders::_1);

И затем где-то передавал:

gBuf.append(f);

Ошибка была:

LNK1179: invalid or corrupt file: duplicate COMDAT (...)

Кажется, что функция-член имеет ту же самую сигнатуру, что и f (или, возможно, превышает максимальный предел, который проверяет компоновщик)

Если я вместо этого напишу ее в строке, без промежуточного f,без ошибок.

gBuf.append(std::bind(&Manager::AppendContacts, this, std::placeholders::_1));

Я не претендую на то, чтобы понять, что здесь происходит, но, возможно, я смогу спасти кого-то пару часов, выяснив это, как я должен был ...

0 голосов
/ 21 декабря 2010

Я снова запустил IDE, а также перезагрузил компьютер, и это не помогло.Мне удалось решить это после того, как я снова очистил и скомпилировал (не перекомпилировал вариант) 2 библиотеки.Я не понимаю, почему это помогло, но мне удалось выполнить проект.

0 голосов
/ 20 декабря 2010

В любом случае, проверьте официальную документацию об этом:

http://msdn.microsoft.com/en-us/library/cddbs9aw%28VS.80%29.aspx

http://msdn.microsoft.com/en-us/library/aa234469%28VS.60%29.aspx

А если вы отметите codeguru , парень найдет другой способ решения проблемы, аналогичный вашей:

Project-> Settings-> вкладка C ++, категория отладки: расширение встроенной функции: изменение с «None» на «Only _inline».

...