首页 > 解决方案 > Cmake,Qt:动态更改 x86/x64 版本的 Bin 和插件的路径

问题描述

已经在 SO 中探索了几个类似的解决方案,但它们似乎都不起作用。

我创建了两个包装脚本,为 x86 和 x64 版本的 Qt 更改 PATH env,仅用于调试特定应用程序架构的应用程序期间。

例如,选择 x86 配置,我需要添加路径msvc2015\binmsvc2015\plugins\platforms能够调试 x86 Qt 应用程序。对于 x64,它将分别是msvc2015_64\binmsvc2015_64\plugins\platforms

作为第一个版本,我创建了脚本setup_path.cmd并将其作为预构建步骤执行

setup_path.cmd

@echo off

set PATH=%PATH%;C:\Qt\5.11.2\msvc2015\bin;C:\Qt\5.11.2\msvc2015\plugins\platforms

...并将其称为预构建步骤CMakeLists.txt

add_custom_command(TARGET ${TARGET} PRE_BUILD COMMAND cmd /c ${CMAKE_CURRENT_SOURCE_DIR}/setup_path.cmd)

路径${CMAKE_CURRENT_SOURCE_DIR}不包含空格。

脚本正常执行,但调试器下的 Qt 应用程序仍然看不到 Qt 库和插件。

我选择编辑 PATH 的方式是最明显的,Qt 可能有更具体的方式,但我无法在文档中轻松找到。

标签: c++qtcmakeenvironment-variables

解决方案


这是因为构建环境与运行/调试环境不同。修改PATH构建环境不会影响您的应用程序运行/调试环境(至少不会影响 CMake)。

问题是您需要告诉 Windows 从何处获取 Qt 的 DLL。DLL 查找是由 windows 按以下顺序按 4 个主要步骤完成的(更多信息在此处):

  1. 加载应用程序的目录
  2. 当前目录
  3. 系统目录
  4. PATH 环境变量中列出的目录

在这种情况下,修改 Windows 系统文件夹真的不是你想做的事情,所以我们剩下其他三个选项。

  1. 将必要的 DLL 复制到应用程序目录中。当应用程序开发人员想要拥有不依赖于必须安装 Qt 的用户的“便携式”软件版本时,通常会采用这种方法。这可以通过windeployqt或来实现BundleUtilities

  2. 在当前工作文件夹中有必要的 DLL。将 DLL 复制到您的工作目录。Visual Studio 中的工作目录在 中定义,Properties of your project -> Configuration Properties -> Debugging -> Working Directory默认设置为$(ProjectDir).

  3. PATH运行调试器时将 DLL 的路径添加到环境变量中。Visual Studio 具有Properties -> Configuration Properties -> Debugging -> Environment允许您修改环境的字段。不幸的是,CMake 没有为你做这件事的工具。但是我们可以通过另一种方式来处理它——通过修改Properties -> Configuration Properties -> VC++ Directories -> Executable Directories. 从 3.12 版开始的 CMake 具有CMAKE_VS_SDK_EXECUTABLE_DIRECTORIES访问它的变量。


还要检查这个答案


推荐阅读