Visual Studio 2013 和 Qt5:QTDIR 设置太晚

6

除了一个问题之外,Qt在MSVC2013上可以正常工作:当设置本地调试环境时,由于未定义$(QTDIR),无法找到DLLs。

我的调试环境设置如下:

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正确处理这个问题,还是我必须手动输入路径?


这是Qt-Add-in已知的一个bug。请参见:https://bugreports.qt.io/browse/QTVSADDINBUG-363 - SteveS
3个回答

7
看起来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。

我已经尝试过了,但是不起作用。能否检查一下$(QTDIR)具有哪个值? - user2368140
对于我来说(MSVS2013,QT5.3.1和5.3.2),自动生成的文件与您的顺序相同,更改它有所帮助。您是否为所有组更改了它?您可以在许多地方看到$QTDIR的值,例如在编辑项目属性(例如General->Output dir->Edit...)时。在编辑时,“Macros>>”会打开一个可搜索的所有可用变量列表。 - Lichtkarussell
是的,我已经更改了两个条目。我还需要做其他事情吗? - user2368140
哦,重新启动Visual Studio解决了问题!但是为什么QTDIR总是被添加两次到调试器环境中呢? - user2368140
查看您的 .user 文件,Release|x64 的属性组根本没有任何关于 QTDIR 的设置!VS 插件应该会为您添加这个设置,但有时它并不会这样做。我不知道为什么会这样。如果在 .user 文件中没有指定,Qt 将会回退到一些神秘的路径,我不知道它从哪里获取。这里有人知道吗? - Ph0t0n

2
感谢您对此问题的讨论。我可以报告,在Qt 5.8 / QT Extension for Windows Version 2.1.1 / Visual Studio 2015中仍存在此问题。症状是在VStudio项目属性Debugger...Environment中将"$(QTDIR)\bin"(Qt DLL的位置)输入为PATH文件夹规范似乎有效,但实际上却无效。
“似乎有效”是指如果单击选项以检查Debugger Environment属性,则环境属性的原始形式看起来像“PATH=$(QTDIR)\bin;...;$(PATH)”,VStudio编辑对话框将有用地通知您该PATH字符串计算为(例如)“PATH=D:\TechApps\Qt\5.8\msvc2015_64b\bin;…” - 如果QTDIR宏确实存在并且具有正确的值,那么就应该是这样。这是极其欺骗性的!
因为“实际上无效”的意思是从VStudio内启动依赖于Qt的应用程序时实际准备使用的PATH不会看到此宏。您美丽的PATH字符串被缩减为"\bin;..."。您可以通过将Qt DLL从$(QTDIR)\bin复制到应用程序可执行文件的文件夹中进行确认。您的应用程序将正确启动。如果您在程序内部检查PATH(例如在c++中使用getenv("PATH")),则会发现程序的PATH字符串缺少QTDIR。(也就是说,如果QTDIR为空字符串,它就是它应该有的样子。)
顺便说一下,此问题的另一个症状是,如果您检查VStudio宏列表,则$(QTDIR)不在列表中。
上述解决方案(重新排列...vcxproj.user中的元素)似乎可以解决问题。当您将QTDIR的定义移动到该文件的较早位置时,应用程序实际可用的PATH字符串是正确的,并且$(QTDIR)存在于Visual Studio已知的宏列表中。
但是,我不知道更改VStudio中的“Qt VS工具”选项或“Qt项目设置”是否会导致.incorrectly再次覆盖用户文件。

0

在解决方案中更改(或重新选择)Qt版本(更改解决方案Qt版本)为我解决了这个问题。

重新初始化项目需要很多秒,即使如此,我认为直到构建项目后才更新了.user文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接