Visual Studio 2013 и Qt5: QTDIR установлен слишком поздно

С Qt в MSVC2013 все работает, кроме одного: библиотеки DLL не найдены, потому что $(QTDIR) не определен, когда установлена ​​локальная среда отладки.

Мои настройки среды отладки:

PATH=$(QTDIR)\bin%3b$(PATH)

Мой файл .user:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <LocalDebuggerEnvironment>PATH=$(QTDIR)\bin%3b$(PATH)</LocalDebuggerEnvironment>
    <QTDIR>C:\Qt\Qt5.4.1\5.4\msvc2013</QTDIR>
    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <LocalDebuggerEnvironment>PATH="$(QTDIR)\bin%3b$(PATH)</LocalDebuggerEnvironment>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <LocalDebuggerEnvironment>PATH=$(QTDIR)\bin%3b"$(QTDIR)\bin%3b$(PATH)</LocalDebuggerEnvironment>
    <QTDIR>C:\Qt\Qt5.4.1\5.4\msvc2013</QTDIR>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <LocalDebuggerEnvironment>PATH="$(QTDIR)\bin%3b$(PATH)</LocalDebuggerEnvironment>
  </PropertyGroup>
</Project>

Не знаю почему, но переменная $(QTDIR) недоступна для LocalDebuggerEnvironment.

Он работает со следующими настройками среды отладки:

PATH=C:\Qt\Qt5.4.1\5.4\msvc2013\bin%3b$(PATH)

Можно ли заставить Visual Studio правильно обрабатывать это или мне нужно ввести путь вручную?


person Community    schedule 24.02.2015    source источник
comment
Это известная ошибка надстройки Qt. См.: bugreports.qt.io/browse/QTVSADDINBUG. -363   -  person SteveS    schedule 20.07.2017


Ответы (3)


Кажется, Visual Studio анализирует строки сверху вниз, поэтому с вашим кодом...

<LocalDebuggerEnvironment>PATH=$(QTDIR)\bin%3b$(PATH)</LocalDebuggerEnvironment>
<QTDIR>C:\Qt\Qt5.4.1\5.4\msvc2013</QTDIR>

...переменная $(QTDIR) определена во второй строке и не может использоваться в первой строке.

Просто измените порядок, чтобы переменная была определена до ее использования:

<QTDIR>C:\Qt\Qt5.4.1\5.4\msvc2013</QTDIR>
<LocalDebuggerEnvironment>PATH=$(QTDIR)\bin%3b$(PATH)</LocalDebuggerEnvironment>

Примечание. Visual Studio считывает файл .user только при запуске, поэтому вам необходимо (пере)запустить Visual Studio после редактирования файла.

person Lichtkarussell    schedule 20.03.2015
comment
Я уже пробовал это, но не работает. Можно ли проверить, какое значение имеет $(QTDIR)? - person ; 21.03.2015
comment
Для меня (MSVS2013, QT5.3.1 и 5.3.2) автоматически сгенерированный файл имел тот же порядок, что и ваш, и его изменение помогло. Вы изменили его для всех групп? Вы можете увидеть значение $QTDIR во многих местах, например, при редактировании свойства проекта (например, General-›Output dir-›Edit...). При редактировании Макросы››открывает доступный для поиска список всех доступных переменных. - person Lichtkarussell; 21.03.2015
comment
Да, я изменил обе записи. Должен ли я делать что-то еще? - person ; 21.03.2015
comment
О, перезапуск Visual Studio решил проблему! Но почему QTDIR всегда дважды добавляется в среду отладчика? - person ; 21.03.2015
comment
Глядя на ваш файл .user, группа свойств для Release|x64 вообще не имеет настройки для QTDIR! Предполагается, что надстройка vs сделает это за вас, но иногда это не так. Понятия не имею почему. Если он не указан в файле .user, Qt возвращается к какому-то загадочному пути, и я понятия не имею, откуда он его взял. Кто-нибудь здесь знает? - person Ph0t0n; 08.06.2016

Спасибо за обсуждение этого вопроса. Я могу сообщить, что он все еще существует в Qt 5.8/QT Extension для Windows версии 2.1.1/Visual Studio 2015. Симптомы заключаются в том, что ввод "$(QTDIR)\bin" (расположение Qt DLL) в качестве папки PATH spec в свойстве проекта VStudio Project Debugger...Environment кажется работать, но на самом деле это не так.

Под «кажется, что работает» я имею в виду, что если вы нажмете на параметр для проверки свойства «Среда отладчика», а необработанная форма свойства «Среда» будет выглядеть как «PATH=$(QTDIR)\bin;...;$(PATH) " диалоговое окно редактирования VStudio сообщит вам, что эта строка PATH оценивается как (например) "PATH=D:\TechApps\Qt\5.8\msvc2015_64b\bin;..." - точно так же, как если бы макрос QTDIR был действительно присутствовал и имел правильное значение. Это жестокий обман!

Потому что под «действительно не работает» я подразумеваю, что PATH, фактически подготовленный для использования при запуске вашего Qt-зависимого приложения из VStudio, не видит этот макрос. Ваша красивая строка PATH сводится к "\bin;...". Вы можете убедиться в этом, временно скопировав библиотеки Qt DLL из $(QTDIR)\bin в папку исполняемого файла вашего приложения. Ваше приложение запустится корректно. И если вы проверите свой PATH из своей программы (используя, например, getenv("PATH") в С++, вы увидите, что в строке PATH вашей программы отсутствует QTDIR. (То есть это то, что было бы, если бы QTDIR была пустой строкой .)

FWIW, еще одним симптомом этой проблемы является то, что если вы просматриваете список макросов VStudio, $(QTDIR) нет в списке.

Описанное выше решение (перестановка элементов в ...vcxproj.user) решает проблему. Когда вы перемещаете определения QTDIR ранее в этом файле, строка PATH, фактически доступная для приложения, является правильной, а $(QTDIR) присутствует в списке макросов, известных Visual Studio.

ОДНАКО, я не знаю, приводит ли изменение параметров «Qt VS Tools» или «Настройки проекта Qt» в VStudio к неправильной повторной записи файла .user.

person Richard Goldhor    schedule 12.06.2017

Изменение (или повторный выбор) версии Qt в решении (Change Solutions Qt Version) устранило проблему для меня.

Повторная инициализация проектов заняла много секунд, и даже тогда я не верю, что файл .user обновился, пока я не выполнил сборку проекта.

person Doug Lexvold    schedule 19.07.2021