我提煉了這個非常簡單的 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
