【发布时间】:2022-10-05 03:30:10
【问题描述】:
我提炼了这个非常简单的 CMake 项目,它使用 vcpkg 并构建了一个简单的 Qt gui 应用程序,只显示一个主窗口。我可以让它在 Visual Studio 2022 中成功构建,但我无法让它无缝运行。出现问题是因为 Qt 平台 DLL 没有在后期构建步骤中与其他 DLL 依赖项一起复制到输出位置。
qwindows.dll(或qwindowsd.dll)文件旨在与可执行文件和其他DLL一起复制到输出位置,但位于platforms\子目录中。这不会在构建过程中发生,但是如果我创建目录并手动复制它,那么应用程序就可以工作。
对我来说,这应该作为构建过程的一部分无缝工作,所以我很想知道我做错了什么或者我设置不正确。
现在我知道最简单的 hacky 解决方案是手动放置一个 CMake 后期构建步骤,将适当的 DLL 从 vcpkg_installed 目录复制到输出目录。但这似乎是一个 hack,因为系统应该已经处理了这个问题,否则许多其他人也会遇到这个问题。
所以我要问的问题:
- 我是否在配置中遗漏了一些琐碎的东西?
- 我不了解 CMake + Qt 的工作原理吗?
- 这种 CMake、vcpkg 和 Qt 的组合是否是预期可以工作的受支持配置?
CMakeLists.txt 是(大部分取自 Qt 自己的示例):
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"
]
}
然后我执行 CMake 以使用 default 预设构建源代码树。
该应用程序的代码实际上是这样的:
// 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 年 1 月 10 日)
- 已安装 CMake 3.22(尽管 vcpkg 下载 3.24 并使用它)
- vcpkg(截至 2022 年 1 月 10 日)
- 正在安装 Qt 6.3.2
【问题讨论】: