c++ - Cmake,Qt:动态更改 x86/x64 版本的 Bin 和插件的路径
问题描述
已经在 SO 中探索了几个类似的解决方案,但它们似乎都不起作用。
我创建了两个包装脚本,为 x86 和 x64 版本的 Qt 更改 PATH env,仅用于调试特定应用程序架构的应用程序期间。
例如,选择 x86 配置,我需要添加路径msvc2015\bin
并msvc2015\plugins\platforms
能够调试 x86 Qt 应用程序。对于 x64,它将分别是msvc2015_64\bin
和msvc2015_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 可能有更具体的方式,但我无法在文档中轻松找到。
解决方案
这是因为构建环境与运行/调试环境不同。修改PATH
构建环境不会影响您的应用程序运行/调试环境(至少不会影响 CMake)。
问题是您需要告诉 Windows 从何处获取 Qt 的 DLL。DLL 查找是由 windows 按以下顺序按 4 个主要步骤完成的(更多信息在此处):
- 加载应用程序的目录
- 当前目录
- 系统目录
- PATH 环境变量中列出的目录
在这种情况下,修改 Windows 系统文件夹真的不是你想做的事情,所以我们剩下其他三个选项。
将必要的 DLL 复制到应用程序目录中。当应用程序开发人员想要拥有不依赖于必须安装 Qt 的用户的“便携式”软件版本时,通常会采用这种方法。这可以通过
windeployqt
或来实现BundleUtilities
。在当前工作文件夹中有必要的 DLL。将 DLL 复制到您的工作目录。Visual Studio 中的工作目录在 中定义,
Properties of your project -> Configuration Properties -> Debugging -> Working Directory
默认设置为$(ProjectDir)
.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
访问它的变量。
还要检查这个答案
推荐阅读
- anaconda - Dask 安装在 Windows 中失败并出现错误:[WinError 2] 系统找不到指定的文件
- ansible - 如何在 ansible-awx 中使用 node 命令运行任务?
- swift - AVAssetExportSession 进度未更新
- sequelize.js - Sequelize 不创建模型关联列
- ms-access - 将记录添加到数据库并同时上传图像(第二次尝试使用不同的代码)
- c++ - 有没有办法在集合中引用类的方法?
- mapstruct - 如何映射到通用类型?
- html - 如何修复我的页脚背景图像始终在移动设备上可见?
- apache-spark - Spark 使用 Yarn Rest API 提交 [Spark 无法解析 namenode HA 名称]
- swift - Alamofire.request().responseJSON 在 Alamofire 5 中不再可用