Как исправить проблему с решением с несколькими репозиториями в сообществе Visual Studio 2022 ⇐ C++
Как исправить проблему с решением с несколькими репозиториями в сообществе Visual Studio 2022
У меня есть следующая структура моего тестового решения:
TestApp (решение) ├─ TestApp (проект) ├─ Субмодули ├─ TestLib (решение) ├─ TestLib (проект) ├─ сторонняя_сторона | ├─ включать | ├─ Нломанн ├─ пч.х ├─ TString.h ├─ TargetEntity.h nlohmann — это библиотека JSON. TestLib — это статическая библиотека, включенная в TestApp в качестве ссылки. TestLib — это подмодуль git внутри репозитория TestApp. TestApp также имеет следующие пути в дополнительных каталогах включения:
$(SolutionDir)Submodules\TestLib\TestLib\3rd_party\include; $(SolutionDir)Субмодули\TestLib\; %(ДополнительныеIncludeDirectories) Вот полный код:
TestApp
main.cpp:
#include "TestLib/TargetEntity.h" #include "TestLib/TString.h" //#include "nlohmann/json.hpp" интервал основной() { //nlohmann::json json; //json["abc"] = 765; TargetEntity тэ; ТСтрока тс; } Библиотека тестов
pch.h:
#ifndef PCH_H #define PCH_H #define WIN32_LEAN_AND_MEAN #include "TString.h" //#include "nlohmann/json.hpp" #endif // PCH_H pch.cpp:
#include "pch.h" TString.h:
#pragma раз #include используя TString = std::wstring; TargetEntity.h:
#pragma раз //#include "TString.h" // Раскомментируйте, чтобы избавиться от ошибки //#include "nlohmann/json.hpp" // Раскомментируйте, чтобы избавиться от ошибки класс TargetEntity { публика: виртуальный ~TargetEntity() = по умолчанию; //void InitializeFromJson(const nlohmann::json& json) {} защищено: TString URL-адрес; }; TargetEntity.cpp:
#include "pch.h" #include "TargetEntity.h" TestLib отлично компилируется как отдельное решение и при компиляции как проект внутри TestApp (я имею в виду, когда вы компилируете только библиотеку). Но когда я пытаюсь скомпилировать TestApp, VS показывает ошибки внутри TargetEntity:
Сборка началась... 1>------ Сборка начата: Проект: TestLib, Конфигурация: Отладка x64 ------ 1>pch.cpp 1>TargetEntity.cpp 1>TestLib.vcxproj -> ...\Temp\TestApp\Build-TestLib-x64-Debug\TestLib.lib 2>------ Сборка началась: Проект: TestApp, Конфигурация: Отладка x64 ------ 2>TestApp.cpp 2>...\Temp\TestApp\Submodules\TestLib\TestLib\TargetEntity.h(13,13): ошибка C3646: 'url': неизвестный спецификатор переопределения 2>...\Temp\TestApp\Submodules\TestLib\TestLib\TargetEntity.h(13,16): ошибка C4430: отсутствует спецификатор типа — предполагается int. Примечание. C++ не поддерживает default-int. 2>Завершено создание проекта «TestApp.vcxproj» — ОШИБКА. Итак, похоже, что VS каким-то образом игнорирует предварительно скомпилированный заголовок для TestLib во время компиляции TestApp. Я знаю, что multi-repo — это функция предварительной версии, но мой сценарий кажется мне «очевидным», возможно, кто-то знает, как решить эту проблему.
Я заметил, что включение соответствующих заголовков внутри TargetEntity решает проблему, но я не хочу делать это во всей библиотеке.
ОБНОВЛЕНИЕ: Я добавил полный код и полный вывод сборки. Для простоты я также прокомментировал код, связанный с nlohmann — проблема осталась.
У меня есть следующая структура моего тестового решения:
TestApp (решение) ├─ TestApp (проект) ├─ Субмодули ├─ TestLib (решение) ├─ TestLib (проект) ├─ сторонняя_сторона | ├─ включать | ├─ Нломанн ├─ пч.х ├─ TString.h ├─ TargetEntity.h nlohmann — это библиотека JSON. TestLib — это статическая библиотека, включенная в TestApp в качестве ссылки. TestLib — это подмодуль git внутри репозитория TestApp. TestApp также имеет следующие пути в дополнительных каталогах включения:
$(SolutionDir)Submodules\TestLib\TestLib\3rd_party\include; $(SolutionDir)Субмодули\TestLib\; %(ДополнительныеIncludeDirectories) Вот полный код:
TestApp
main.cpp:
#include "TestLib/TargetEntity.h" #include "TestLib/TString.h" //#include "nlohmann/json.hpp" интервал основной() { //nlohmann::json json; //json["abc"] = 765; TargetEntity тэ; ТСтрока тс; } Библиотека тестов
pch.h:
#ifndef PCH_H #define PCH_H #define WIN32_LEAN_AND_MEAN #include "TString.h" //#include "nlohmann/json.hpp" #endif // PCH_H pch.cpp:
#include "pch.h" TString.h:
#pragma раз #include используя TString = std::wstring; TargetEntity.h:
#pragma раз //#include "TString.h" // Раскомментируйте, чтобы избавиться от ошибки //#include "nlohmann/json.hpp" // Раскомментируйте, чтобы избавиться от ошибки класс TargetEntity { публика: виртуальный ~TargetEntity() = по умолчанию; //void InitializeFromJson(const nlohmann::json& json) {} защищено: TString URL-адрес; }; TargetEntity.cpp:
#include "pch.h" #include "TargetEntity.h" TestLib отлично компилируется как отдельное решение и при компиляции как проект внутри TestApp (я имею в виду, когда вы компилируете только библиотеку). Но когда я пытаюсь скомпилировать TestApp, VS показывает ошибки внутри TargetEntity:
Сборка началась... 1>------ Сборка начата: Проект: TestLib, Конфигурация: Отладка x64 ------ 1>pch.cpp 1>TargetEntity.cpp 1>TestLib.vcxproj -> ...\Temp\TestApp\Build-TestLib-x64-Debug\TestLib.lib 2>------ Сборка началась: Проект: TestApp, Конфигурация: Отладка x64 ------ 2>TestApp.cpp 2>...\Temp\TestApp\Submodules\TestLib\TestLib\TargetEntity.h(13,13): ошибка C3646: 'url': неизвестный спецификатор переопределения 2>...\Temp\TestApp\Submodules\TestLib\TestLib\TargetEntity.h(13,16): ошибка C4430: отсутствует спецификатор типа — предполагается int. Примечание. C++ не поддерживает default-int. 2>Завершено создание проекта «TestApp.vcxproj» — ОШИБКА. Итак, похоже, что VS каким-то образом игнорирует предварительно скомпилированный заголовок для TestLib во время компиляции TestApp. Я знаю, что multi-repo — это функция предварительной версии, но мой сценарий кажется мне «очевидным», возможно, кто-то знает, как решить эту проблему.
Я заметил, что включение соответствующих заголовков внутри TargetEntity решает проблему, но я не хочу делать это во всей библиотеке.
ОБНОВЛЕНИЕ: Я добавил полный код и полный вывод сборки. Для простоты я также прокомментировал код, связанный с nlohmann — проблема осталась.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение