我提煉了這個非常簡單的 CMake 專案,它使用 vcpkg 并構建了一個簡單的 Qt gui 應用程式,只顯示一個主視窗。我可以讓它在 Visual Studio 2022 中成功構建,但我無法讓它無縫運行。出現問題是因為 Qt 平臺 DLL 沒有在后期構建步驟中與其他 DLL 依賴項一起復制到輸出位置。
(qwindows.dll
或qwindowsd.dll
)檔案旨在與可執行檔案和其他 DLL 一起復制到輸出位置,但位于platforms\
子目錄中。這不會在構建程序中發生,但如果我創建目錄并手動復制它,那么應用程式就可以作業。
對我來說,這應該作為構建程序的一部分無縫作業,所以我很想知道我做錯了什么或者我設定不正確。
現在我知道最簡單的 hacky 解決方案是手動放置一個 CMake 后期構建步驟,以將適當的 DLL 從vcpkg_installed
目錄復制到輸出目錄。但這似乎是一種黑客攻擊,因為系統應該已經處理了這個問題,否則許多其他人也會遇到這個問題。
所以我要問的問題:
- 我在配置中錯過了一些微不足道的東西嗎?
- 我不了解 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
uj5u.com熱心網友回復:
據我所知,您必須呼叫一個名為 windeployqt 的工具來掃描您的源/二進制檔案并構建所需內容的串列。比它應該自動部署它。請注意,這可能還不夠,因為某些庫/插件可能具有外部依賴項,而這些可能不會被考慮在內。一些動態依賴項或插件可能也無法識別,但請查看 windeployqt 幫助了解您可以實作的目標。
uj5u.com熱心網友回復:
vcpkg 沒有魔法可以自動將 Qt6 dll 部署到需要它們的地方。閱讀https://doc.qt.io/qt-6/windows-deployment.html以了解必要的內容。
對于 Qt 6.3,請閱讀https://www.qt.io/blog/cmake-deployment-api。Qt 有自己的 cmake API 來幫助部署。
如果您想從 cmake 手動呼叫 windeployqt,請確保使用 cmake 目標!在 vcpkg 中,目標已被調整以處理發布/除錯。
部署 dll 的另一種方法是部署具有正確路徑集的 qt.conf。有一個除錯/發布變體<vcpkg_installed>/<triplet>/tools/Qt6
,可以用作模板來正確設定它
uj5u.com熱心網友回復:
感謝此處其他答案的幫助,我能夠弄清楚這個片段以添加到我上面的 CMake 配置中。
add_custom_command(TARGET QtGuiTest POST_BUILD
COMMAND Qt6::windeployqt
ARGS $<TARGET_FILE:QtGuiTest>
)
最終windeployqt
在構建后步驟中以最簡單的方式呼叫應用程式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/513283.html
標籤:qt制作vcpkg