В 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>
Шаги для воспроизведения:
- Запустите Visual Studio 2019 и создайте новый проект
- Выберите Google Test в качестве типа проекта
- В диалоговом окне Test Project Configuration оставьте значения по умолчанию (Использовать Google Test как stati c library и библиотеки времени выполнения C ++: динамически связывать)
- Открыть диалоговое окно свойств проекта, и для всех конфигураций и всех платформ установить Platform Toolset в Visual Studio 2015 (v140)
- Создать проект
Я думаю, что возможности
- Я просто где-то пропускаю настройку,
- 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 года, и поэтому компоновщик должен соответствовать этой более поздней версии.