Как я могу устранить эту ошибку ссылки в Visual Studio (LNK2005)? - PullRequest
4 голосов
/ 04 июня 2009

У меня постоянно возникают ошибки компоновщика в следующей форме:

libcmtd.dll msvmrtd.dll некоторый элемент (например: _mkdir) уже определяется ...

и я не знаю, как их решить.

Вот полное сообщение об ошибке:

private: __thiscall type_info :: type_info (класс type_info const &) " (?? 0type_info @@ AAE @ ABV0 @@ Z) уже определены в LIBCMTD.lib (typinfo.obj)

MSVCRTD.lib (ti_inst.obj): ошибка LNK2005: «личное: класс type_info & __thiscall type_info :: operator = (class type_info const &) "(?? 4type_info @@ AAEAAV0 @ ABV0 @@ Z) уже определен в LIBCMTD.lib (typinfo.obj)

Можете ли вы помочь мне решить эту проблему?

Ответы [ 4 ]

8 голосов
/ 04 июня 2009

Проверьте несколько вещей:

  1. Ваши заголовочные файлы защищены. То есть у них есть #ifndef охранников.

  2. Вы определяете (не шаблонные) функции в заголовках без ключевого слова inline. Это портит много вещей.

  3. Вы пытаетесь определить шаблоны в файле .cpp. Все определения шаблонов должны быть в заголовках.

Пожалуйста, напишите код и точный текст ошибки!

4 голосов
/ 04 июня 2009

Ваша проблема в том, что вы связываете два файла с одинаковым символом.

Вы не предоставили реальное сообщение об ошибке, поэтому мы не можем точно сказать вам, в чем проблема, но, вероятно, вы связываетесь с библиотеками из двух разных версий Visual Studio.

Существуют также решения, доступные при поиске в Интернете (я полагаю, вы сделали это, но просто пропустили соответствующие статьи :-), в которых предлагается решить проблему, изменив параметры проекта с "Multi-threaded Debug(/MTd)" на "Multi-threaded Debug DLL (/MTD)", но не смотрел на это.

Пожалуйста, опубликуйте полную ошибку, чтобы мы могли предложить более адресную помощь.

2 голосов
/ 15 марта 2016

Убедитесь, что опция, которую вы выбираете для связывания библиотеки времени выполнения, одинакова для каждого проекта и библиотеки. Свойства проекта -> Свойства конфигурации -> C / C ++ -> Генерация кода -> Библиотека времени выполнения -> «Многопоточная» / «Многопоточная DLL» / ...

Моя проблема заключалась в том, что все мои проекты на C ++ были "многопоточными", но я ссылался на модули fortran, которые были "многопоточными DLL"

1 голос
/ 09 февраля 2010

В статье MSDN по LNK4098 есть очень полезная таблица: в ней указывается, какие библиотеки нужно вручную добавить в список «Игнорировать определенную библиотеку», в зависимости от того, какую CRT вы используете. Вам нужно выбрать CRT (многопоточный или нет; статический или DLL; отладка или выпуск), а затем добавить библиотеки игнорирования на основе вашего выбора.

Основная причина более подробно описана в KB154753 ... библиотеках, с которыми программа будет связываться при сборке с использованием Visual C ++

Моя интерпретация этого заключается в том, что в определенных ситуациях алгоритм, который автоматически выбирает, с какими библиотеками CRT связать ваш код, выберет несколько конфликтующих библиотек.

...