Skip to content

打包

测试环境:Qt 6.8

在纯 QWidget 项目中,直接使用以下命令进行打包:

windeployqt6.exe xxx.exe

但是,在项目中混用 QMLQWidget 时,打包方式不同。尝试在 windeployqt6 后添加 --qmldir 参数:

windeployqt6.exe xxx.exe --qmldir <qml-directory>

测试结果无效。对比 Qt 示例生成文件VS2022 编译项目生成文件 后,发现问题与 --qmldir 无关。

1 链接可执行程序

cmake 配置如下:

set(BINDIR bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${LIBDIR})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${LIBDIR})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${BINDIR})

qt_add_qml_module(AIxyz
    URI EXE_RESOURCES
    VERSION 1.0
    QML_FILES resources/qml/Mesh3DBrowser.qml
    NO_RESOURCE_TARGET_PATH
)

该配置使可执行文件和 EXE_RESOURCES 文件夹位于不同目录。打包时仅拷贝了可执行文件,导致缺失 QML 资源文件。

解决方案:将 EXE_RESOURCES 文件夹放在可执行文件所在目录中,确保打包工具能够加载所有资源。--qmldir 则无需添加。

2 链接 library

项目中还可能需要通过链接库文件引入 qmlCMake 配置示例如下:

```cmake
add_library(SimpleBorder QuickWidgetManager.cpp QuickWidgetManager.h)

target_include_directories(SimpleBorder
PUBLIC
\(<BUILD_INTERFACE:\)>
\(<INSTALL_INTERFACE:\)>
)

qt_add_qml_module(${PROJECT_NAME}
URI SimpleBorder_RSS
VERSION 1.0
QML_FILES
"MediaPlayer.qml"
"Mesh3DBrowser.qml"
"controls/PlaybackControl.qml"
...
RESOURCES
"images/backward10.svg"
...
)

 ```cmake
add_executable(AIxyz WIN32 ${SRCS})

target_link_libraries(AIxyz PRIVATE
    Qt6::Widgets
    ...
)

target_link_libraries(AIxyz PRIVATE
    SimpleBorder
    SimpleBorderplugin
)

解决方案:在打包时,将所有 *.qml 文件复制到可执行程序所在目录,例如新建一个 ./quick 文件夹,将所有 QML 文件放入其中。运行 windeployqt6 后可以删除该文件夹。如果 QML 程序不引入新的模块(import),通常只需拷贝一次。