Связывание googleTest в VS2010 приводит к LNK2005 из-за других зависимых библиотек

У меня есть большой и сложный проект, который наконец-то получает модульные тесты. Я создал googleTest 1.6.0 локально с помощью Visual Studio 2010, файлы проекта были созданы с помощью cmake, как указано в README.

В этом проекте есть много зависимых библиотек, которые статически и динамически связаны. Многие из них проприетарные. Все попытки связать приводят к 220 таким ошибкам. Вот пример:

msvcprtd.lib (MSVCP100D.dll): ошибка LNK2005: "public: void __cdecl std :: _ Container_base12 :: _ Orphan_all (void)" (? _Orphan_all @ _Container_base12 @ std @@ QEAAXXZ) уже определено в gtest.lib (gtest-all. объект)

libcpmtd.lib (cerr.obj): ошибка LNK2005: "protected: char * __cdecl std :: basic_streambuf> :: _ Gndec (void)" (? _Gndec @? $ basic_streambuf @ DU? $ char_traits @ D @ std @@@ std @@ IEAAPEADXZ), уже определенный в msvcprtd.lib (MSVCP100D.dll)

LIBCMTD.lib (setlocal.obj): ошибка LNK2005: _configthreadlocale уже определен в MSVCRTD.lib (MSVCR100D.dll)

ССЫЛКА: предупреждение LNK4098: defaultlib 'MSVCRTD' конфликтует с использованием других библиотек; используйте / NODEFAULTLIB: ссылка на библиотеку: предупреждение LNK4098: defaultlib 'LIBCMTD' конфликтует с использованием других библиотек; используйте / NODEFAULTLIB: библиотека

фатальная ошибка LNK1169: найден один или несколько многократно определенных символов

Я пробовал флаг / NODEFAULTLIB, и я пытался игнорировать только msvcprtd.lib, MSVCRTD.lib и LIBCMTD.lib, как было предложено, но затем я страдаю от неразрешенных символов ...

И проект, и googleTest скомпилированы с использованием x64, / MP, / MDd и без / clr.

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


person Matthew Reddington    schedule 19.09.2011    source источник


Ответы (1)


Похоже, ответ на ваш вопрос есть в FAQ. Убедитесь, что все ваши библиотеки используют параметр / MD (d).

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

  • LNK2005: символ уже определен в объекте
  • LNK4217: локально определенный символ 'symbol' импортирован в функцию 'function'
  • LNK4049: импортированный локально определенный символ 'symbol' В проекте Google Test (gtest.vcproj) для параметра Runtime Library установлено значение / MT (использовать многопоточные статические библиотеки, / MTd для отладки). Если в вашем проекте используется что-то еще, например / MD (используйте многопоточные библиотеки DLL, / MDd для отладки), вам необходимо изменить настройку в проекте Google Test, чтобы она соответствовала вашему проекту.

Чтобы обновить этот параметр, откройте свойства проекта в среде разработки Visual Studio, затем выберите ветвь Configuration Properties | C / C ++ | Генерация кода и измените параметр «Библиотека времени выполнения». Вы также можете попробовать использовать gtest-md.vcproj вместо gtest.vcproj.

person VladLosev    schedule 22.09.2011
comment
Оказывается, вы правы. Я забыл, что отправил этот вопрос, прежде чем наткнулся на ответ в собственном испытании. - person Matthew Reddington; 03.10.2011
comment
Хотя несколько лет назад, не могли бы вы исправить (сейчас) неверную ссылку на часто задаваемые вопросы на: github.com/google/googletest/blob/master/googletest/docs/ - person PiJ; 24.08.2017