石河子网站建设公司,上海发乐门网站建设公司,软件开发申请专利流程,电商平台项目计划书项目场景#xff1a;
需要编译一个静态版本的应用程序#xff0c;并用upx进行压缩#xff0c;以便减少携带的动态链接库#xff0c;生成每个文件不超过10MB的轻量级绿色发布包。使用动态库不利于发布。准备发布的环境#xff0c;是学校的教学中心的学生计算机。学生计算机…项目场景
需要编译一个静态版本的应用程序并用upx进行压缩以便减少携带的动态链接库生成每个文件不超过10MB的轻量级绿色发布包。使用动态库不利于发布。准备发布的环境是学校的教学中心的学生计算机。学生计算机的每一台机器都可能安装有不同版本的Qt且时常污染环境变量(PATH)导致链接了其他版本Qt的程序启动时遇到问题。不能为每一种Qt发布包编译一个发行版。 问题描述
当使用 MSYS2 Mingw64 Qt6 static 进行编译的时候无论 qmake 还是 cmake都会报错。 QMAKE 会报链接错误
... undefined reference to __imp_mng_get_userdata
......CMake 也会报错
CMake Error in CMakeLists.txt:IMPORTED_IMPLIB not set for imported target harfbuzz::harfbuzzconfiguration Release.原因分析
MSYS2 的Qt静态发行版并没有完全遵循“静态链接”的要求。很多库依旧需要用动态链接的资源来引入。这种不一致性使得Qt为主流win32静态连编如VC编译器准备的库编译脚本、客户程序构建脚本不适用于MSYS2静态编译环境。客户程序还需要加入额外的信息以链接相关的库。 解决方案
通过搜索缺失的函数入口所对应的库可以较快找齐所有的依赖。
对QMAKE建议加入:
#################### taskbusplatform.pri
#Qt6 Widgets static link in MSYS2 need extra dependencies.
contains(QT, widgets){
MSYSTEM_PREFIX$$(MSYSTEM_PREFIX)
greaterThan(MSYSTEM_PREFIX, ){
contains(CONFIG, static) {message(STATIC Qt6 with MSYS2. Extra patch should be introduced.);QMAKE_LIBS -ltiff -lmng.dll -ljpeg -ljbig -ldeflate -lzstd -llerc -llzma -lgraphite2 -lbz2 -lusp10 -lRpcrt4 -lsharpyuv -lOleAut32
}
}
}########################submodules
QT core gui network
greaterThan(QT_MAJOR_VERSION, 4): QT widgets
include (../../../taskbusplatform.pri)注意如果不想使用pri文件则需要在每个widgets项目都包含这个配置。也可以放在pri文件里一并包含
CMake 由于CMAKE会记忆构建树的历史变量相对较为方便。在所有子项目开始前执行下面这段脚本
#FIX MINGW64 Qt6 static link problems.
find_package(QT NAMES Qt6 COMPONENTS Core Widgets REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Widgets REQUIRED)
if (QT_FEATURE_static STREQUAL ON AND WIN32 AND MINGW)set_property(TARGET harfbuzz::harfbuzz PROPERTYIMPORTED_IMPLIB ${harfbuzz_DIR}../../../libharfbuzz.dll.a )
endif()
参考
MINGW-packages issue 18966