Ошибка компоновщика при создании проекта Google Test в Visual Studio 2019 с помощью инструментов сборки v140 - PullRequest
1 голос
/ 16 января 2020

В Visual Studio я хотел бы создать решение, включающее проект Google Test с модульными тестами C ++ библиотеки stati c, созданной другим проектом в решении, и я хочу сделать это с помощью Visual Studio 2015 (v140) инструменты сборки.

(Общая информация: я работаю над проектом, для которого требуется библиотека, предоставленная сторонним поставщиком, и поставщик заявляет о совместимости только до набора инструментов Visual Studio 2015. Я наблюдаю непредвиденное поведение этой библиотеки, и я пытаюсь воспроизвести эту проблему в модульном тесте с конфигурацией, которая на 100% соответствует тому, что, как они утверждают, поддерживается, поэтому я могу сообщить об этом эффективно.)

Когда я пытаюсь это, я могу построить проект нормально, если я оставлю набор инструментов платформы по умолчанию (v142). Но если я установлю набор инструментов платформы на Visual Studio 2015 (v140), то сборка проекта завершится с ошибкой:

LNK2019 unresolved external symbol ___std_reverse_trivially_swappable_4 referenced in function "void __cdecl std::_Reverse_unchecked1<enum testing::internal::edit_distance::EditType *>(enum testing::internal::edit_distance::EditType * const,enum testing::internal::edit_distance::EditType * const,struct std::integral_constant<unsigned int,4>)" (??$_Reverse_unchecked1@PAW4EditType@edit_distance@internal@testing@@@std@@YAXQAW4EditType@edit_distance@internal@testing@@0U?$integral_constant@I$03@0@@Z)

Файл, на который он указывает, - gtestd.lib(gtest-all.obj). Файл My NuGet packages.config содержит только следующее:

<packages>
  <package id="Microsoft.googletest.v140.windesktop.msvcstl.static.rt-dyn" version="1.8.1.2" targetFramework="native" />
</packages>

Шаги для воспроизведения:

  1. Запустите Visual Studio 2019 и создайте новый проект
  2. Выберите Google Test в качестве типа проекта
  3. В диалоговом окне Test Project Configuration оставьте значения по умолчанию (Использовать Google Test как stati c library и библиотеки времени выполнения C ++: динамически связывать)
  4. Открыть диалоговое окно свойств проекта, и для всех конфигураций и всех платформ установить Platform Toolset в Visual Studio 2015 (v140)
  5. Создать проект

Я думаю, что возможности

  • Я просто где-то пропускаю настройку,
  • Googletest 1.8.1, как известно, несовместим с инструментами сборки v140, или
  • , это ошибка.

Если это ошибка, я не уверен, сообщить ли об этом Google Test Adapter или Googletest .

Обновление

После поиска вопросов, относящихся к вам в целом я решил, что моя проблема - это вариант описанной здесь проблемы: https://developercommunity.visualstudio.com/content/problem/205947/binary-compatibility-possibly-broken-using-stdreve.html

Предлагаемое решение:

Спасибо за сообщение об этой проблеме. Я разрешаю его как «По замыслу», потому что двоичная совместимость здесь не нарушена - вместо этого есть правило, которому нужно следовать.

Вы можете смешивать код, скомпилированный с обновлениями 2015 и 2017 годов, но набор инструментов, который выполняет окончательную ссылку (против стандартной библиотеки C ++) не может быть старше любого из наборов инструментов, которые использовались для компиляции входных данных. Здесь вы создаете библиотеку stati c с набором инструментов 19.12, но выполняете окончательную связь с набором инструментов 19.11, который слишком стар. Можно смешивать код 19.11 и 19.12, но компоновщик должен быть 19.12 или новее.

Итак, я предполагаю, что двоичные файлы Googletest, предоставляемые пакетом NuGet, скомпилированы с компилятором позднее 2015 года, и поэтому компоновщик должен соответствовать этой более поздней версии.

...