Как устранить ошибку Link 2005 в Visual Studio? - PullRequest
0 голосов
/ 28 мая 2009
error LNK2005: "public: __thiscall std::basic_ostream<char,struct std::char_traits<char> >::basic_ostream<char,struct std::char_traits<char> >(class std::basic_streambuf<char,struct std::char_traits<char> > *,bool)" (??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits
@D@std@@@1@_N@Z) already defined in msvcprtd.lib(MSVCP80D.dll)  libcpmtd.lib

Я получаю эту ошибку, когда пытаюсь включить опцию /clr и /MDd в подпроект.

По отдельности все проекты строятся успешно, но когда я строю основной проект, он показывает подобные ошибки.

Как решить эту проблему?

Я полностью раздосадован.

Ответы [ 4 ]

1 голос
/ 29 мая 2009

Убедитесь, что все ваши отдельные проекты скомпилированы с одинаковыми библиотеками времени выполнения, это указано в:

Properties -> C/C++ -> Code Generation -> Runtime Library

Если вы используете /MDd, убедитесь, что все остальные проекты тоже. В противном случае, когда вы объедините их все вместе в основном проекте, он импортирует несколько версий библиотек времени выполнения, что приведет к ошибке, которую вы наблюдаете.

0 голосов
/ 28 мая 2009

Компоновщик говорит, что видел этот символ, определенный в нескольких объектных файлах / библиотеках.

Попытайтесь выяснить, какие из них сделать экспортировать (например, используя dumpbin), выяснить, почему (какая-то стандартная библиотека связана статически?) И нужна ли она вам.

Для этого конкретного случая:

Этот оператор предоставляется как встроенный (что определяет ваши проекты, чтобы определить его), так и как экспорт из msvcprtd.dll. Вы можете обойти это, объявив символ как __declspec(dllimport).

0 голосов
/ 28 мая 2009

Используйте динамические или статические связанные библиотеки времени выполнения:

LIBCPMTD.LIB - Многопоточная, статическая ссылка

MSVCPRTD.LIB - Многопоточная, динамическая связь (библиотека импорта для MSVCP80D.DLL)

0 голосов
/ 28 мая 2009

Похоже, вы связываете статически скомпилированные библиотеки с DLL? msvcprtd.lib - это статическая библиотека для STL, которая связывается при компиляции с /MDd.

Libcmptd.lib - это библиотека CRT, которая используется при указании /MTd.

Смотрите здесь , для каких библиотек и какой настройки используются.

Проверьте настройки сборки, чтобы они были одинаковыми.

...