A您想要静态编译。这不适用于 Qt 库和 Mingw 库本身,因为它们也需要静态编译。
但它们仅作为动态链接库分发。
如果您确实想要拥有可静态链接的 Qt 库,则需要先静态编译 Qt,然后才能链接它们。有一些关于静态编译 Qt 的描述。但这是一项繁重的工作。
B为什么找不到 Qt5Core.dll:
在 Qt Creator 中,由于编译器/工具链自动检测,应用程序的 Qt 库的路径会自动设置。
但是,当您独立运行应用程序可执行文件时,不会设置 Qt 库的路径,并且它们不会驻留在可执行文件旁边的应用程序文件夹中。
为了解决这个问题我建议使用windeployqt
。
Windeployqt 分析您构建的库或可执行文件,并将所需的 Qt 依赖项复制到构建文件夹中。
我倾向于为此使用 cmake 辅助函数。
- Create
windeployqt.cmake
包含以下内容并将其放入/cmake
项目的模块文件夹:
find_package(Qt5Core REQUIRED)
# get absolute path to qmake, then use it to find windeployqt executable
get_target_property(_qmake_executable Qt5::qmake IMPORTED_LOCATION)
get_filename_component(_qt_bin_dir "${_qmake_executable}" DIRECTORY)
function(windeployqt target)
# POST_BUILD step
# - after build, we have a bin/lib for analyzing qt dependencies
# - we run windeployqt on target and deploy Qt libs
add_custom_command(TARGET ${target} POST_BUILD
COMMAND "${_qt_bin_dir}/windeployqt.exe"
--verbose 1
--release
--no-svg
--no-angle
--no-opengl
--no-opengl-sw
--no-compiler-runtime
--no-system-d3d-compiler
\"$<TARGET_FILE:${target}>\"
COMMENT "Deploying Qt libraries using windeployqt for compilation target '${target}' ..."
)
endfunction()
Note 1: --verbose 1
已设置,以便您了解发生了什么。您稍后可以禁用它。
注2:排除项请自行处理。我不知道您的应用程序的具体要求,例如如果您需要 OpenGL 或 SVG 支持。
- 然后添加到您的
CMakeLists.txt
:
# Set path to our custom CMAKE scripts
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake")
# Include Qt deployment helper function
include(windeployqt)
最后添加到最后CMakeLists.txt
:
windeployqt(Scrollable)
现在,windeployqt 作为可执行文件上的 POST_BUILD 步骤运行,将 qt 库复制到构建文件夹。可执行文件现在将从该文件夹中获取 Qt 依赖项,并且应该能够独立运行(无需设置 Qt 库的路径)。
请记住还要复制其他依赖项,例如第三方库或运行时依赖项。
mingw 依赖项的后续操作:
set(QT_MINGW "/path/to/your/qt/mingw/compiler")
add_custom_command(TARGET Scrollable POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_MINGW}/bin/libgcc_s_dw2-1.dll $<TARGET_FILE_DIR:${TARGET}>
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_MINGW}/bin/libstdc++-6.dll $<TARGET_FILE_DIR:${TARGET}>
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QT_MINGW}/bin/libwinpthread-1.dll $<TARGET_FILE_DIR:${TARGET}>
COMMENT "Deploy mingw runtime libraries from ${QT_MINGW}/bin"
)