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

问题描述 投票:0回答:1

如何在Windows上静态编译支持OpenSSL的Qt(使用MinGW编译器)这个Qt构建的预期 "结果 "是构建并发布一个内置SSL支持的便携式Qt应用程序。

因此,这是一个老问题,在这个主题上有许多问题,但解决这个问题的方案却很少。这些问题(和问题)中的一些。

不胜枚举

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

这些问题大多没有答案,而那些提供的答案(显然)对编译没有帮助,由于一些错误的输出,或者仅仅是OpenSSL从来没有被链接(内置于portanbinary应用程序中),或者许多其他错误。

此外,似乎有很多关于使用 -ssl, -openssl-linked, -openssl 以及各自的含义。另外,如果应该使用 -L/path/to/libs/static -l library1 -l library2 与使用 OPENSSL_HOME env变量,并指定头文件& 静态链接库等的路径。

请注意:

理想的情况是,在编译时,需要为库提供特定的指令,如 OpenSSL v1.0.2OpenSSL v1.1qmake 在构建静态Qt的过程中,除了需要考虑的事项外,还需要考虑那些特定库的参数。

Qt是怎么说的?

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

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

这是一个很不自然的 "问题",但看到这么多问题中novery很少有针对每个具体问题中挑剔的情况的解决方案,所以很难得到一个通用的解决方案。

我把这个问题贴出来,是希望能得到一个通用的解决方案,让大家受益。

c++ qt ssl openssl mingw
1个回答
1
投票

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

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

以下是我对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

我已经通过构建KeePassXC测试了结果 (https:/github.comkeepassxrebootassxcarchive2.5.4.tar.gz),结果包中没有任何Qt DLLs,运行正常。

© www.soinside.com 2019 - 2024. All rights reserved.