Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 如何将Qt的windeployqt集成为Visual Studio构建工作流的一部分?_Visual Studio_Qt_Deployment_Qt5_Windeployqt - Fatal编程技术网

Visual studio 如何将Qt的windeployqt集成为Visual Studio构建工作流的一部分?

Visual studio 如何将Qt的windeployqt集成为Visual Studio构建工作流的一部分?,visual-studio,qt,deployment,qt5,windeployqt,Visual Studio,Qt,Deployment,Qt5,Windeployqt,每次在Visual Studio中首次构建新的Qt项目时,即使安装了VS工具,我也必须复制一些与Qt相关的二进制文件Qt5Core.dll、平台文件。。。。否则,从Visual Studio运行时,将正确找到Qt5Core.dll或debug one,但找不到平台dll: 显然,当从IDE外部运行done时,它也会失败,例如,在自动构建的单元测试期间 Qt有一个工具可以这样做,叫做Qt,它基本上查找依赖项Qt并复制它们。例如: c:\Qt\Qt5.12.1\bin\windeployqt c:\

每次在Visual Studio中首次构建新的Qt项目时,即使安装了VS工具,我也必须复制一些与Qt相关的二进制文件Qt5Core.dll、平台文件。。。。否则,从Visual Studio运行时,将正确找到Qt5Core.dll或debug one,但找不到平台dll:

显然,当从IDE外部运行done时,它也会失败,例如,在自动构建的单元测试期间

Qt有一个工具可以这样做,叫做Qt,它基本上查找依赖项Qt并复制它们。例如:

c:\Qt\Qt5.12.1\bin\windeployqt c:\projects\qt-project\Release --release
将分析c:\projects\qt project\Release中的可执行文件,并将所需的DLL、插件、翻译和其他相关二进制文件复制到该位置


我感兴趣的是如何将windeployqt集成到Visual Studio的构建工作流中,这样即使在不同的计算机中签出,这个过程也是自动的。

您显然可以创建一个批处理文件并执行它,但请记住,您必须在编译项目后执行,因为该工具将查看可执行文件。此外,您还必须处理构建路径和Qt安装目录位置,以使其能够跨系统移植

更方便的方法是在项目属性>生成事件>生成后事件中将windeployqt配置为生成后事件。我在这里记录这些,因为我找不到任何明确的参考,我花了一段时间才弄明白

要处理可移植性:

$QTDIR:这个变量扩展到当前Qt版本的安装路径,我假设它是一个Qt项目,当然,并且已经安装。使用它在$QTDIR\bin\下定位windeployqt

$OutDir:扩展到可执行文件的生成目录。通常,引用它来处理带有空格的路径。这里的问题是$OutDir通常以反斜杠\结尾,因此当扩展$OutDir时,它将创建一个转义字符\将被错误解释。为了修复它,可以修剪前导斜杠:$OutDir.TrimEnd'\'

$Configuration:扩展为当前配置的名称,通常为Debug或Release,请阅读下面的其他配置名称。现在,windeployqt对于-debug或-release参数是区分大小写的,配置名称是Title cased。要降低它的大小写:-$Configuration.toLower。此步骤仅用于使用公共命令,可以通过手动放置-debug或-release标志来跳过

使用此命令,完整的生成后命令如下所示:

"$(QTDIR)\bin\windeployqt.exe" "$(OutDir.TrimEnd('\'))" --$(Configuration.toLower())
此命令可以统一应用于项目的所有平台和配置

现在,如果您有Release和Debug之外的其他配置,您可以:

通过相应地添加-debug或-release来修改命令,或

为基于调试的配置和基于发布的配置创建自定义属性页,并将BaseConfiguration等变量设置为debug或release,然后在命令中使用此新变量


如果只想从Visual Studio运行和/或调试应用程序,则不必复制这些dll,您可以在Visual Studio中将依赖项路径添加到调试器环境中

您可以在Visual Studio中这样做:

右键单击解决方案资源管理器中的vcxproj文件 从上下文菜单中单击属性 在打开的对话框中,导航到左侧面板中的调试 在右侧面板中查找环境,在其中可以使用以下内容:

路径=$QTDIR\bin$路径

注意:当您往回编辑时,您可以看到“;”的一些编码这不是问题,您只需在编辑时小心,以免遗漏“;”在任意两条路径之间

如果项目依赖于更多的库,您可以在其中添加更多的环境路径,不要忘记对所有构建选项Release/Debug/x64/x86/etc进行编辑,并且您可以使用每个外部库的基本路径定义自己的变量

现在回到Qt,该QTDIR变量在.user文件中定义,对于所有构建配置,您将有如下内容:

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <QTDIR>C:\Qt\5.12.1\msvc2017_64</QTDIR>
    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
    <LocalDebuggerEnvironment>PATH=$(QTDIR)\bin%3b$(PATH)</LocalDebuggerEnvironment>
  </PropertyGroup>
我遇到的一个问题是,QTDIR被替换为LocalDebuggerEnvironment,我的意思是首先定义LocalDebuggerEnvironment,显然这不起作用,因此如果是这样,只需手动将这两个定义替换为您最喜欢的文本或xml编辑器,这样QTDIR就可以在之前定义


因此,我建议使用这种方法,而不是将windeploy作为自定义构建步骤的一部分,而是将windeploy用于为安装程序生成或准备文件的脚本。

谢谢!我将对此进行研究,但从VS运行时遇到的主要问题是平台DLL和插件,VS没有正确找到它们。此外,在自动化编译期间,一些自动化测试是从VS外部运行的。我想我在这个问题上还不够清楚。使用这个VS可以找到DLL。至于汽车
匹配测试是所有开发计算机上的所有开发人员都使用的测试吗?如果没有,那么这些自动测试可能会将exe从构建路径升级,然后使用windeploy或其他带来依赖项的脚本,我不希望windeploy在每次构建时都复制这些依赖项,更不用说windeploy只适用于Qt,不复制任何其他依赖项是的,每次完整编译都会传递测试,可以跳过,但通常不会完成。关于其他依赖项,可以使用其他工具解决,windeployqt的问题是它需要可执行文件,因此必须在构建之后运行,而不是像其他只分析项目的工具那样在构建之前运行。关于复制的文件,这还不是一个大问题,因为增加的时间几乎被忽略了,但我们同意这是一个需要考虑的问题。此外,我们不提交。用户文件,因为它们取决于每个用户配置,在签出时应用此更改的某种方式可能是为了不同的问题?是的,.user文件将不在版本控制上,因为每个成员都可以在其他路径上具有依赖关系。但是,在每次构建之后仍然要复制依赖项是一种过分的做法。如果您不喜欢默认方式,并且需要作为独立测试运行,那么运行一次python脚本可能会更好