You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:20:33