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

У меня большой и сложный проект, который наконец проходит модульные тесты. Я построил 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 -all.obj)

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, насколько я понимаю, не намекал на то, что я мог бы понять. Я надеялся на э

1 Ответ

12 голосов
/ 22 сентября 2011

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

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

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

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

...