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

KGC*_*beX 5 c++ ssl qt openssl mingw

如何在 Windows 上静态编译具有 OpenSSL 支持的 Qt(使用 MinGW 编译器) \n此 Qt 构建的预期“结果”是构建并发布具有内置 SSL 支持的可移植 Qt 应用程序。

\n\n

所以这是一个古老的问题,关于这个主题有很多问题,但解决这个问题的解决方案却很少。其中一些问题(和问题):

\n\n\n\n

还有更多

\n\n

以及我自己的一些问题(使用 OpenSSL v1.1.1d & Qt 5.13 和 MinGW ):

\n\n\n\n

这些问题中的大多数都没有答案,而且提供的这些答案(显然)对编译没有帮助,因为一些错误输出或者只是 OpenSSL 从未链接(内置到便携式/二进制应用程序中),或者许多其他错误。

\n\n

-ssl此外,对于使用、-openssl-linked-openssl以及各自的含义似乎存在很多混淆。另外,如果应该使用-L/path/to/libs/static -l library1 -l library2envOPENSSL_HOME变量并指定标头和静态/链接库等的路径

\n\n

请注意:

\n\n

理想情况下,在编译时,需要针对库的特定指令,例如OpenSSL v1.0.2orOpenSSL v1.1qmake理想情况下,在编译过程中,除了构建过程中应考虑的事项之外,还

\n\n

Qt 说什么?

\n\n

Qt 以这 2 篇文章的形式提供了一些帮助:

\n\n\n\n

这个问题的目的是给出详细的解释和逐步的方法,为那些需要使用 SSL 编译静态 Qt 版本的人提供一些支持和指导。

\n\n

这是一个不自然的“问题”,但是看到如此多的问题,而每个特定问题中的精选案例没有/很少有解决方案,因此很难获得通用的解决方案。

\n\n

我发布这个问题是希望能够提供一个可以使所有人受益的通用解决方案。

\n

Bre*_*ers 1

我最近才注意到这个问题,所以我还没有时间从头开始编写完整的分步说明,但我能够在我的环境中静态构建 qt-5.15.0基于 MSYS2 shell 以及 MinGW-w64 和来自http://winlibs.com/的 GCC 10 个人构建,所有先决条件都已在同一环境中编译。

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
Run Code Online (Sandbox Code Playgroud)

以下是我静态构建 qt-5.15.0 的步骤:

# 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
Run Code Online (Sandbox Code Playgroud)

我通过构建 KeePassXC ( https://github.com/keepassxreboot/keepassxc/archive/2.5.4.tar.gz )来测试结果,生成的包根本没有 Qt DLL,并且运行良好。