#visual-studio #qt #visual-c #msbuild
Вопрос:
За последние полтора месяца или около того у меня возникла странная проблема. Я не знаю, что изменилось, поскольку в то время я не менял настройки или не обновлялся. Это решение было создано для меня в прошлом.
При создании моего решения многие vcxproj завершаются с ошибками, подобными этой:
<...>qt_globals.targets(327,5): error MSB3491: Could not write lines to file "<...>tempBuildx64DebugTOOLConcurrencyConcurrency.tlogmoc.write.1u.tlog". The process cannot access the file '<...>tempBuildx64DebugTOOLConcurrencyConcurrency.tlogmoc.write.1u.tlog' because it is being used by another process.
Иногда также происходит сбой с MSB3501, что является аналогичной ошибкой.
Я использую Visual Studio 2019.
Обходным путем является изменение настроек Visual Studio, чтобы строить только с использованием 1 процесса вместо разрешения параллельных сборок. Это медленно и раздражает.
Кажется, это происходит только с моими проектами QtMsBuild, но я просмотрел журналы диагностики и определил, что более глубокая причина, по-видимому, заключается в том, что MSBuild фактически создает ссылки на проекты каждого проекта, а не просто ссылается на них.
Согласно статье Microsoft (https://docs.microsoft.com/en-us/visualstudio/msbuild/build-process-overview?view=vs-2019 ), Visual Studio строится иначе, чем MSBuild командной строки.
Существуют некоторые существенные различия между сборкой проектов в Visual Studio и при непосредственном вызове MSBuild либо через исполняемый файл MSBuild, либо при использовании объектной модели MSBuild для запуска сборки. Visual Studio управляет порядком сборки проекта для сборок Visual Studio; он вызывает MSBuild только на уровне отдельного проекта, и когда это происходит, устанавливается пара логических свойств (BuildingInsideVisualStudio, BuildProjectReferences ), которые существенно влияют на то, что делает MSBuild. Внутри каждого проекта выполнение происходит так же, как при вызове через MSBuild, но разница возникает с проектами, на которые ссылаются. В MSBuild, когда требуются проекты, на которые ссылаются, фактически выполняется сборка; то есть он запускает задачи и инструменты и генерирует выходные данные. Когда сборка Visual Studio находит проект, на который ссылается ссылка, MSBuild возвращает только ожидаемые результаты из проекта, на который ссылается ссылка; это позволяет Visual Studio управлять сборкой этих других проектов. Visual Studio определяет порядок сборки и вызывает MSBuild отдельно (по мере необходимости), все полностью под контролем Visual Studio.
Я наблюдаю, как Visual Studio создает каждый проект в решении в правильном порядке сборки, а также каждый проект создает избыточные ссылки на свои проекты.
Просматривая мои журналы диагностики, для свойства BuildProjectReferences установлено значение true, что неожиданно для сборки Visual Studio. Я пытался принудительно установить значение false, но это не решает проблему, так что, возможно, это был отвлекающий маневр. Тем не менее, похоже, что сборка ведет себя скорее как MSBuild, чем Visual Studio.
Как я могу диагностировать, почему Visual Studio / MSBuild делает это?
Комментарии:
1. Возможно, некоторые действия не будут выполнены во время параллельного построения. Например, файл открыт, и один процесс, возможно, из одного проекта, записывает в него коды, и он не завершает его, но запускается другой процесс, и ему тоже нужно получить доступ к этому файлу. Но изменили ли вы некоторые коды или другие вещи, поскольку, похоже, эта ошибка раньше не появлялась.