简体   繁体   English

如何使用 MinGW 编译器和 SSL 支持静态编译 Qt

[英]how to statically compile Qt using MinGW compiler and SSL support

How to statically compile Qt with OpenSSL support on Windows (with MinGW compiler) The desired 'outcome' of this Qt build is to build and ship a portable Qt application with built-in SSL support. How to statically compile Qt with OpenSSL support on Windows (with MinGW compiler) The desired 'outcome' of this Qt build is to build and ship a portable Qt application with built-in SSL support.

So this is an age old problem with a multitude of questions on this topic, yet very few solutions exist that solves the problem.所以这是一个古老的问题,有很多关于这个主题的问题,但很少有解决方案可以解决这个问题。 Some of these questions (and problems):其中一些问题(和问题):

there are many more还有很多

and some of my own questions (using OpenSSL v1.1.1d & Qt 5.13 with MinGW ):和我自己的一些问题(使用 OpenSSL v1.1.1d & Qt 5.13 和 MinGW ):

Most of these questions do not have answers, and those answers provided (obviously) did not help in compiling, due to some error output or simply OpenSSL was never linked (built into the portable/binary application), or many other errors.这些问题中的大多数没有答案,并且提供的那些答案(显然)对编译没有帮助,原因是一些错误 output 或只是 OpenSSL 从未链接(内置于便携式/二进制应用程序中)或许多其他错误。

Further, there appears to be alot of confusion about using -ssl , -openssl-linked , -openssl and what each means.此外,关于使用-ssl-openssl-linked-openssl以及它们各自的含义似乎存在很多混淆。 Also, if one should use -L/path/to/libs/static -l library1 -l library2 vs using the OPENSSL_HOME env variable and specify the path to headers & static / linked libraries, etc此外,如果应该使用-L/path/to/libs/static -l library1 -l library2 vs 使用OPENSSL_HOME变量并指定标题和 static / 链接库等的路径

Please note:请注意:

Ideally, in compiling, specific instructions for libraries would be required such as OpenSSL v1.0.2 or OpenSSL v1.1 and the qmake arguments in building a static Qt with those specific libraries in addition to things that should be considered during the build process. Ideally, in compiling, specific instructions for libraries would be required such as OpenSSL v1.0.2 or OpenSSL v1.1 and the qmake arguments in building a static Qt with those specific libraries in addition to things that should be considered during the build process.

What does Qt say? Qt 说什么?

Qt has provide some help in the form of these 2 posts: Qt 以这两个帖子的形式提供了一些帮助:

The aim of this question is to give a detailed explanation and step-wise method in allowing those who need to compile a static Qt version with SSL some support and direction.这个问题的目的是给出一个详细的解释和逐步的方法,让那些需要编译 static Qt 版本的人得到一些支持和指导。

This is an unnatural "question", but having seen so many questions with no/very few solutions for cherrypicked cases in each specific question makes a general solution very difficult to obtain.这是一个不自然的“问题”,但是在每个特定问题中看到这么多问题没有/很少有针对精选案例的解决方案,因此很难获得通用解决方案。

I am posting this question in hopes of a general solution being made available that could benefit all.我发布这个问题是希望提供一个可以使所有人受益的通用解决方案。

I just noticed this question just recently, so I haven't had time yet to write complete step-by-step instructions from the ground up, but I was able to do a static build of qt-5.15.0 in my environment which is based on MSYS2 shell together with MinGW-w64 with GCC 10 personal build from http://winlibs.com/ with all the prerequisites already compiled in the same environment.我最近才注意到这个问题,所以我还没有时间从头开始编写完整的分步说明,但是我能够在我的环境中构建 qt-5.15.0 的 static基于 MSYS2 shell 以及 MinGW-w64 和 GCC 10 个来自http://winlibs.com的个人构建已经在相同的环境中编译。

The version of openssl was 1.1.1g built like this (static and shared libraries): openssl 的版本是 1.1.1g,这样构建的(静态库和共享库):

# location of Perl
PERLDIR=/d/Prog/Perl/strawberry-perl-5.30.0.1-64bit-portable/perl
# install destination
INSTALLPREFIX=/d/Prog/winlibs64-10.1.0/custombuilt
# for 32-bit replace mingw64 with mingw in the next line
./Configure --prefix=$INSTALLPREFIX threads shared zlib-dynamic -DOPENSSL_NO_CAPIENG mingw64 &&
make &&
PATH=$PERLDIR/bin:$PATH make -j1 install OPENSSLDIR_dir=$INSTALLPREFIX &&
strip $INSTALLPREFIX/bin/*.exe $INSTALLPREFIX/bin/*.dll &&
cp -f $INSTALLPREFIX/lib/libcrypto.a $INSTALLPREFIX/lib/libeay32.a && 
cp -f $INSTALLPREFIX/lib/libcrypto.dll.a $INSTALLPREFIX/lib/libeay32.dll.a && 
cp -f $INSTALLPREFIX/lib/libssl.a $INSTALLPREFIX/lib/libssleay32.a && 
cp -f $INSTALLPREFIX/lib/libssl.dll.a $INSTALLPREFIX/lib/libssleay32.dll.a && 
cp -f ms/applink.c $INSTALLPREFIX/include/openssl/ && 
echo Success

Here are the steps I did to do the static build of qt-5.15.0:以下是我执行 qt-5.15.0 的 static 构建的步骤:

# location of Python
PY2DIR=/d/Prog/Python/WinPython-64bit-2.7.13.1Zero/python-2.7.13.amd64
# location of all the prerequisites
MINGWPREFIX=/d/Prog/winlibs64-10.1.0/custombuilt
# install destination
INSTALLPREFIX=/d/Prog/winlibs64-10.1.0/custombuilt
# fix missing SHARE_INFO_1 in qtbase/src/corelib/io/qfilesystemengine_win.cpp 
echo "#include <levmar.h>" | gcc -E -xc - &> /dev/null && sed -i.bak -e "s/\(#\s*include <\)lm\.h\(>\)/\1levmar.h\2\n\1lmshare.h\2\n\1lmapibuf.h\2/" qtbase/src/corelib/io/qfilesystemengine_win.cpp
# avoid using missing debug ICU libraries in static builds
sed -i.bak -e "s/\(lsicu..\)d/\1/g" qtbase/src/corelib/configure.json
# configure
mkdir -p build_static &&
cd build_static &&
PATH=$PATH:$PY2DIR ../configure -platform win32-g++ -prefix $INSTALLPREFIX/qt -opensource -confirm-license -release -static -no-pch -no-rpath -strip -skip "qtserialbus" -qpa windows -gif -sql-odbc -sql-sqlite -opengl desktop -icu -system-pcre -dbus -system-sqlite -system-zlib -system-libpng -system-libjpeg -system-doubleconversion -system-freetype -system-harfbuzz -libproxy -system-proxies -openssl -openssl-linked -no-xcb -no-compile-examples -skip qtwebengine -nomake examples -system-proxies -plugin-manifests -pkg-config -I $MINGWPREFIX/include/freetype2 -I $MINGWPREFIX/include/mariadb &&
sed -i.bak -e "s/\(-lclang\)\.a/\1 -lpthread/" qttools/src/qdoc/Makefile.* &&
cd .. &&
# build
(
 PATH=$PATH:$PY2DIR mingw32-make -Cbuild_static release QMAKE_CXXFLAGS="-fcommon" QMAKE_LFLAGS="-Wl,-allow-multiple-definition" || (
  make -Cbuild_static/qttools/src/qdoc &&
  PATH=$PATH:$PY2DIR mingw32-make -Cbuild_static release QMAKE_CXXFLAGS="-fcommon" QMAKE_LFLAGS="-Wl,-allow-multiple-definition"
)) &&
# workaround for missing qmake.exe
cp build_static/qtbase/bin/qmake.exe build_static/qtbase/qmake/ &&
make -Cbuild_static install &&
# manually create qt.conf
echo "[Paths]" > $INSTALLPREFIX/qt/bin/qt.conf &&
echo "Prefix=../../qt" >> $INSTALLPREFIX/qt/bin/qt.conf &&
echo Success

I have tested the result by building KeePassXC ( https://github.com/keepassxreboot/keepassxc/archive/2.5.4.tar.gz ) against it and the resulting package had no Qt DLLs at all and it ran fine. I have tested the result by building KeePassXC ( https://github.com/keepassxreboot/keepassxc/archive/2.5.4.tar.gz ) against it and the resulting package had no Qt DLLs at all and it ran fine.

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM