Visual Studio+CMake+vcpkg构建时qwindows.dll未复制到platform目录
基于CMake和vcpkg搭建了极简Qt GUI项目,仅展示主窗口,可在Visual Studio 2022中构建成功,但无法正常运行。核心问题是:构建后Qt平台DLL(qwindows.dll/qwindowsd.dll)未被复制到输出目录的platforms子目录,手动创建目录并复制文件后程序可正常运行。希望通过构建自动完成该过程,而非手动拷贝,因此提出以下问题:
- 是否遗漏了配置中的关键项?
- 对CMake与Qt的协作机制是否存在误解?
- CMake、vcpkg与Qt的组合是否为官方支持的可正常工作的配置?
项目配置文件
CMakeLists.txt
cmake_minimum_required(VERSION 3.22 FATAL_ERROR) project(QtTest LANGUAGES CXX) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets) qt_standard_project_setup() add_executable(QtGuiTest Source/Main.cpp Source/MainWindow.cpp Source/MainWindow.hpp ) target_link_libraries(QtGuiTest PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets) set_target_properties(QtGuiTest PROPERTIES WIN32_EXECUTABLE ON MACOSX_BUNDLE ON)
CMakePresets.json
{ "version": 3, "cmakeMinimumRequired": { "major": 3, "minor": 22, "patch": 0 }, "configurePresets": [ { "name": "default", "displayName": "Default", "generator": "Visual Studio 17 2022", "architecture": "x64", "toolchainFile": "$env{VCPKG_ROOT}\\scripts\\buildsystems\\vcpkg.cmake" } ] }
vcpkg.json
{ "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg/master/scripts/vcpkg.schema.json", "name": "qtguitest", "version": "0.1", "dependencies": [ "qtbase" ] }
项目代码
// MainWindow.hpp #pragma once #include <QtGui> class MainWindow : public QWindow { Q_OBJECT public: explicit MainWindow(QWindow* parent = nullptr); }; // MainWindow.cpp #include "MainWindow.hpp" MainWindow::MainWindow(QWindow* parent) : QWindow(parent) {} // Main.cpp #include <QApplication> #include "MainWindow.hpp" int main(int argc, char* argv[]) { QApplication q_application{argc, argv}; MainWindow main_window; main_window.show(); return q_application.exec(); }
使用环境
- Visual Studio 2022社区版(2022年10月1日最新版)
- 本地安装CMake 3.22,vcpkg自动下载并使用CMake 3.24
- vcpkg(2022年10月1日版本)
- Qt 6.3.2
1. 是否遗漏了配置中的关键项?
是,你遗漏了Qt运行时部署的关键配置。Qt6的qt_standard_project_setup()仅设置了基础的项目规范(如AUTOMOC、AUTOUIC自动处理),但不会自动处理运行时依赖(包括平台插件)的拷贝。
解决方法是在CMakeLists.txt中添加Qt的部署命令,在目标构建完成后自动拷贝依赖和插件:
# 在target_link_libraries之后添加 qt_deploy_runtime_dependencies(QtGuiTest BUNDLE_ONLY DEBUG_SUFFIX d )
该命令会自动识别目标依赖的Qt DLL、平台插件(如qwindows.dll)及其他资源,并复制到正确的输出目录结构中。
另外,若依赖vcpkg的自动部署,可在CMakePresets.json的configurePresets中添加"cacheVariables": {"VCPKG_APPLOCAL_DEPS": "ON"},让vcpkg自动拷贝基础依赖DLL,但vcpkg对Qt插件的处理不如Qt原生部署命令完善,更推荐使用前者。
2. 对CMake与Qt的协作机制是否存在误解?
存在误解。CMake与Qt的协作中,构建阶段仅负责编译链接生成可执行文件,而运行时依赖(包括平台插件、资源文件等)的部署属于构建后的附加步骤,不会默认自动执行。
Qt6提供了专门的CMake模块处理部署:
qt_standard_project_setup()仅启用Qt的核心构建特性(如MOC、UIC自动处理)- 部署依赖需要显式调用
qt_deploy_runtime_dependencies或qt_generate_deploy_app_script生成部署脚本,CMake会在构建目标后执行脚本完成依赖拷贝。
你之前的配置仅完成了编译链接,未触发部署步骤,因此平台插件未被复制到输出目录。
3. CMake、vcpkg与Qt的组合是否为官方支持的可正常工作的配置?
是的,该组合是官方支持且可稳定运行的:
- Qt官方从Qt5开始就提供完善的CMake支持,Qt6进一步强化了CMake集成,
qt_standard_project_setup()等命令均为官方推荐用法。 - vcpkg官方维护了
qtbase等Qt相关端口,确保Qt可通过vcpkg正常安装并集成到CMake项目中。 - Visual Studio 2022对CMake和vcpkg的集成有官方支持,可直接通过CMake Presets调用vcpkg工具链。
只要配置正确(如添加部署命令),三者可以稳定协作完成Qt项目的构建和部署。
内容的提问来源于stack exchange,提问作者Dominik Grabiec

