每次在Visual Studio中首次构建新的Qt项目时,即使安装了VS Tools,我也必须复制一些与Qt相关的二进制文件(Qt5Core.dll,平台文件...)。否则,从Visual Studio运行时,会正确找到Qt5Core.dll
(或调试一个),但不会找到平台DLL:
很明显,当从IDE外部运行时,例如在自动构建的单元测试期间,它也会失败。
Qt的工具叫做windeployqt
,它基本上会查找依赖项(Qt)并复制它们。例如:
c:\Qt\Qt5.12.1\bin\windeployqt c:\projects\qt-project\Release --release
将分析c:\projects\qt-project\Release
中的可执行文件,并将所需的DLL,插件,翻译和其他相关二进制文件复制到该位置。
我对如何将windeployqt
集成到Visual Studio的构建工作流中感兴趣,因此该过程是自动的(即使在不同的计算机上检出)。
答案 0 :(得分:0)
您显然可以创建一个批处理文件并执行它,但要记住,在编译项目后必须 进行处理,因为该工具将查看可执行文件。另外,您还必须处理构建路径和Qt安装目录位置,以便使其能够跨系统移植。
一种更方便的方法是将windeployqt
配置为项目中的构建后事件(“项目”属性>“构建事件”>“构建后事件”)。 我在这里记录这是因为我找不到任何明确的参考,并且花了我一段时间才弄清楚。
要处理可移植性:
$(QTDIR)
:此变量扩展到当前Qt版本的安装路径(当然,我假设它是Qt项目,并且已经安装了Qt VS Tools)。使用它来找到windeployqt
(在$(QTDIR)\bin\
下)。
$(OutDir)
:扩展到可执行文件的构建目录。像往常一样,引用它来处理带有空格的路径。这里的问题是$(OutDir)
通常以反斜杠(\
)结尾,因此,当"$(OutDir)"
展开时,它将创建一个转义字符\"
,该字符将被错误地解释。为了解决这个问题,您可以修剪斜杠:"$(OutDir.TrimEnd('\'))"
(credits)。
$(Configuration)
:扩展为当前配置的名称(通常为 Debug 或 Release ,以下为其他配置名称)。现在,windeployqt
对于--debug
或--release
参数是区分大小写的,并且配置名称为标题大小写。要使其小写:--$(Configuration.toLower())
(credits)。此步骤仅用于执行通用命令,可以通过手动放置--debug
或--release
标志来跳过。
使用此命令,完整的构建后命令如下:
"$(QTDIR)\bin\windeployqt.exe" "$(OutDir.TrimEnd('\'))" --$(Configuration.toLower())
此命令可以在项目的所有平台和配置中统一应用。
现在,如果您有Release
和Debug
以外的其他配置,则可以:
通过相应地添加--debug
或--release
来修改命令,或者
为“基于调试的配置”和“基于发行版的配置”创建自定义属性页面,并将变量(例如BaseConfiguration
)设置为Debug
或Release
,然后在命令中使用此新变量。
答案 1 :(得分:0)
如果只想从Visual Studio运行和/或调试应用程序,则不必复制这些dll,可以在Visual Studio中将依赖项路径添加到调试器环境。
您可以在Visual Studio中执行以下操作:
Properties
Debugging
(在左侧面板中)在右侧窗格中查找Environment
,在其中可以使用类似以下内容的内容:
PATH = $(QTDIR)\ bin; $(PATH)
注意:当您进行编辑时,可以看到';'的一些编码。没问题,您只需要在编辑时小心,就不会错过';'。在任何两条路径之间。
如果项目依赖于更多库,则可以在其中添加更多环境路径,并且不要忘记对所有构建选项(Release / Debug / x64 / x86 / etc)进行编辑,并且可以使用以下命令定义自己的变量:每个外部库的基本路径。
现在回到Qt,在.user文件中定义了QTDIR变量,对于所有构建配置,您将具有以下内容:
<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)编辑器手动交换这2个定义,以便在之前定义QTDIR。
因此,我建议使用此方法,而不是在自定义构建步骤中使用windeploy,而是将windeploy用于生成安装程序(或为安装程序准备文件)的脚本。