操作系统:Windows 7 SP1 64-bit
编译器:MSVC 2017社区版(Community Edition)
所有源码:qBittorrent.zip
在Windows 7操作系统中使用MSVC 2017编译32位和64位的BT下载软件qBittorrent,详情可参考Compiling: MSVC 2017 (static linkage)(时间久了,网址可能会失效,参考本文一样可以成功编译)。本文只验证编译32位的qBittorrent的操作过程。操作过程如下:
一、编译前准备
1、下载所使用的软件以及依赖库
(1)、Perl语言解析程序,下载最新版本的Strawberry Perl并安装。
(2)、下载最新版本的NASM assembler并安装(可能需要为它的安装路径设置环境变量path)。
(3)、下载zlib-1.2.11.tar.gz并将它拷贝到工作目录,它的SHA256校验码为“c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1”。
(4)、下载openssl-1.1.1d.tar.gz并将它拷贝到工作目录,它的SHA256校验码为“1e3a91bc1f9dfce01af26026f856e064eab4c8ee0a8f457b5ae30b40b8b711f2”。
(5)、下载boost_1_71_0.zip并将它拷贝到工作目录,它的SHA256校验码为“85a94ac71c28e59cf97a96714e4c58a18550c227ac8b0388c260d6c717e47a69”。
(6)、下载libtorrent-rasterbar-1.2.2.tar.gz并将它拷贝到工作目录。
(7)、下载Qt源码qt-everywhere-src-5.13.2.zip并将它拷贝到工作目录,它的MD5校验码为“39a0465610f70d9f877f42fc5337d1ac”。
(8)、下载qBittorrent源码qbittorrent-4.2.5.tar.gz并将它拷贝到工作目录,它的SHA256校验码为“8b45080860f1322bae5e13866fadf132dc1a8b37a7eafac6c7a3021fa2c97976”。
2、创建工作目录G:\QBITTORRENT(使用其他目录效果相同,只是在后面的操作中需要正确填写你所使用的工作目录),然后在该工作目录下创建base和qt5等两个子目录,分别用于存放编译Qt所依赖的库以及Qt自身的库。
32位:
G:\QBITTORRENT\install_msvc32\base
G:\QBITTORRENT\install_msvc32\qt5
64位:
G:\QBITTORRENT\install_msvc64\base
G:\QBITTORRENT\install_msvc64\qt5
3、使用命令行的方式编译程序,通过路径“开始->所有程序-> Visual Studio 2017-> Visual Studio Tools-> VC”打开命令行终端,编译32位的程序使用终端“x86 Native Tools Command Prompt for VS 2017”,64位的使用“适用于 VS 2017 的 x64 本机工具命令提示”。打开命令行终端之后,使用命令“cd /d G:\QBITTORRENT”将当前目录切换到工作目录。
二、编译Zlib
1、解压zlib-1.2.11.tar.gz。
2、进入Zlib源码目录,如“cd G:\QBITTORRENT\zlib-1.2.11\zlib-1.2.11”。
3、修改win32/Makefile.msc文件中的CFLAGS,ASFLAGS和LDFLAGS等选项的值,如下所示:
32-bit: CFLAGS = -nologo -O1 -Oy- -Gy -Gw -GL -MT $(LOC)
64-bit: CFLAGS = -nologo -O1 -Gy -Gw -GL -MT $(LOC)
LDFLAGS = /NOLOGO /DYNAMICBASE /NXCOMPAT /LTCG /OPT:REF /OPT:ICF=5 /MANIFEST:EMBED /INCREMENTAL:NO /NODEFAULTLIB:MSVCRT
选项ASFLAGS删除“-Zi”值。
4、使用命令“nmake -f win32/Makefile.msc”编译Zlib。
5、将所生成的zlib.h、zconf.h和zlib.lib等文件拷贝到工作目录。使用xcopy命令拷贝文件时,会询问是否创建include和lib目录。
32位:
xcopy zlib.h G:\QBITTORRENT\install_msvc32\base\include
xcopy zconf.h G:\QBITTORRENT\install_msvc32\base\include
xcopy zlib.lib G:\QBITTORRENT\install_msvc32\base\lib
64位:
xcopy zlib.h G:\QBITTORRENT\install_msvc64\base\include
xcopy zconf.h G:\QBITTORRENT\install_msvc64\base\include
xcopy zlib.lib G:\QBITTORRENT\install_msvc64\base\lib
三、编译OpenSSL(需要perl和nasm程序)
1、解压openssl-1.1.1d.tar.gz。
2、进入OpenSSL源码目录,如“cd G:\QBITTORRENT\openssl-1.1.1d\openssl-1.1.1d”。
3、使用以下命令生成makefile文件(需要在C盘生成一个无用的目录openssl)。
32位:
perl Configure VC-WIN32 no-shared no-zlib no-zlib-dynamic threads --release --openssldir=C:\openssl --prefix=G:\QBITTORRENT\install_msvc32\base -IG:\QBITTORRENT\install_msvc32\base\include -LG:\QBITTORRENT\install_msvc32\base\lib --with-zlib-lib=G:\QBITTORRENT\install_msvc32\base\lib\zlib.lib
64位:
perl Configure VC-WIN64A no-shared no-zlib no-zlib-dynamic threads --release --openssldir=C:\openssl --prefix=G:\QBITTORRENT\install_msvc64\base -IG:\QBITTORRENT\install_msvc64\base\include -LG:\QBITTORRENT\install_msvc64\base\lib --with-zlib-lib=G:\QBITTORRENT\install_msvc64\base\lib\zlib.lib
4、修改makefile,(1)、为选项CFLAGS增加值“-Oy- -Gy -Gw -GL -MT”(32位)或“-Gy -Gw -GL -MT”(64位);(2)、以下面的值替换LDFLAGS选项原有的值:
LDFLAGS=/NOLOGO /SUBSYSTEM:CONSOLE /DYNAMICBASE /NXCOMPAT /LTCG /OPT:REF /OPT:ICF=5 /MANIFEST:EMBED /INCREMENTAL:NO /NODEFAULTLIB:MSVCRT
5、使用以下命令编译OpenSSL。
nmake
nmake test
6、安装OpenSSL。由于我们在修改LDFLAGS选项时,删除了“/debug”值,所以在编译时不会生成*.pdb文件,而下面的安装命令却需要“apps/openssl.pdb”这个文件,因此我们需要手动生成一个无效的openssl.pdb文件。一个简单的方法,就是复制apps目录下的openssl.exe文件并将其重命名为openssl.pdb。然后再执行下面的命令安装OpenSSL:
nmake install_sw
安装完成后,删除这个无效的G:\QBITTORRENT\install_msvc32\base\bin\openssl.pdb文件(64位编译执行类似的命令,目录不同而已)。
四、编译Boost
1、解压boost_1_71_0.zip。
2、进入Boost源码目录,如“cd G:\QBITTORRENT\boost_1_71_0\boost_1_71_0”。
3、执行脚本bootstrap.bat生成b2.exe程序。
4、使用下面的命令编译Boost(libtorrent只用到其中的system库),其中“-j N”中的N表示我们打算使用多少个线程同时编译Boost,比如我们所使用的电脑的CPU为4核,那么我们可以用4替代N。
32位:
b2 -q --with-system --toolset=msvc-14.1 variant=release link=static runtime-link=static include="G:\QBITTORRENT\install_msvc32\base\include" library-path="G:\QBITTORRENT\install_msvc32\base\lib" define=BOOST_ASIO_DISABLE_CONNECTEX cxxflags="-O1 -Oy- -Gy -Gw -GL" linkflags="/NOLOGO /DYNAMICBASE /NXCOMPAT /LTCG /OPT:REF /OPT:ICF=5 /MANIFEST:EMBED /INCREMENTAL:NO" --hash -j N
64位:
b2 -q --with-system --toolset=msvc-14.1 address-model=64 variant=release link=static runtime-link=static include="G:\QBITTORRENT\install_msvc64\base\include" library-path="G:\QBITTORRENT\install_msvc64\base\lib" --prefix="G:\QBITTORRENT\install_msvc64\base" cxxflags="-O1 -Gy -Gw -GL" linkflags="/NOLOGO /DYNAMICBASE /NXCOMPAT /LTCG /OPT:REF /OPT:ICF=5 /MANIFEST:EMBED /INCREMENTAL:NO" --hash -j N
编译所生成的静态库存放在G:\QBITTORRENT\boost_1_71_0\boost_1_71_0\stage\lib目录下,头文件存放在G:\QBITTORRENT\boost_1_71_0\boost_1_71_0目录下的boost目录下。
五、编译libtorrent
1、解压libtorrent-rasterbar-1.2.2.tar.gz。
2、进入libtorrent源码目录,如“cd G:\QBITTORRENT\libtorrent-rasterbar-1.2.2\libtorrent-rasterbar-1.2.2”。
3、将boost_1_71_0中的b2.exe拷贝到当前目录,如“copy ..\..\boost_1_71_0\boost_1_71_0\b2.exe b2.exe”。
4、使用下面的命令编译libtorrent,其中“-j N”中的N表示我们打算使用多少个线程同时编译Boost,比如我们所使用的电脑的CPU为4核,那么我们可以用4替代N。
32位:
b2 -q --without-python --toolset=msvc-14.1 variant=release link=static runtime-link=static debug-symbols=on encryption=on crypto=openssl openssl-version=1.1 logging=off dht=on windows-version=win7 boost-link=static -sBOOST_ROOT="G:\qBittorrent\boost_1_71_0\boost_1_71_0" include="G:\QBITTORRENT\install_msvc32\base\include" include="G:\QBITTORRENT\boost_1_71_0\boost_1_71_0" library-path="G:\QBITTORRENT\install_msvc32\base\lib" library-path="G:\QBITTORRENT\boost_1_71_0\boost_1_71_0\stage\lib" --prefix="G:\QBITTORRENT\install_msvc32\base" define=BOOST_ASIO_DISABLE_CONNECTEX cxxflags="-O1 -Oy- -Gy -Gw -GL" linkflags="/NOLOGO /DYNAMICBASE /NXCOMPAT /LTCG /OPT:REF /OPT:ICF=5 /MANIFEST:EMBED /INCREMENTAL:NO" --hash -j N
64位:
b2 -q --without-python --toolset=msvc-14.1 address-model=64 variant=release link=static runtime-link=static debug-symbols=on encryption=on crypto=openssl openssl-version=1.1 logging=off dht=on windows-version=win7 boost-link=static -sBOOST_ROOT="G:\qBittorrent\boost_1_71_0\boost_1_71_0" include="G:\QBITTORRENT\install_msvc64\base\include" include="G:\QBITTORRENT\boost_1_71_0\boost_1_71_0" library-path="G:\QBITTORRENT\install_msvc64\base\lib" library-path="G:\QBITTORRENT\boost_1_71_0\boost_1_71_0\stage\lib" --prefix="G:\QBITTORRENT\install_msvc64\base" cxxflags="-O1 -Gy -Gw -GL" define=BOOST_ASIO_DISABLE_CONNECTEX linkflags="/NOLOGO /DYNAMICBASE /NXCOMPAT /LTCG /OPT:REF /OPT:ICF=5 /MANIFEST:EMBED /INCREMENTAL:NO" --hash -j N
5、使用下面的命令安装libtorrent库,其中“-j N”中N的意义与第四步骤相同。
32位:
b2 -q --without-python --toolset=msvc-14.1 variant=release link=static runtime-link=static debug-symbols=on encryption=on crypto=openssl openssl-version=1.1 logging=off dht=on windows-version=win7 boost-link=static -sBOOST_ROOT="G:\qBittorrent\boost_1_71_0\boost_1_71_0" include="G:\QBITTORRENT\install_msvc32\base\include" include="G:\QBITTORRENT\boost_1_71_0\boost_1_71_0" library-path="G:\QBITTORRENT\install_msvc32\base\lib" library-path="G:\QBITTORRENT\boost_1_71_0\boost_1_71_0\stage\lib" --prefix="G:\QBITTORRENT\install_msvc32\base" define=BOOST_ASIO_DISABLE_CONNECTEX cxxflags="-O1 -Oy- -Gy -Gw -GL" linkflags="/NOLOGO /DYNAMICBASE /NXCOMPAT /LTCG /OPT:REF /OPT:ICF=5 /MANIFEST:EMBED /INCREMENTAL:NO" --hash -j N install
64位:
b2 -q --without-python --toolset=msvc address-model=64 variant=release link=static runtime-link=static debug-symbols=on encryption=on crypto=openssl openssl-version=1.1 logging=off dht=on windows-version=win7 boost-link=static -sBOOST_ROOT="G:\qBittorrent\boost_1_71_0\boost_1_71_0" include="G:\QBITTORRENT\install_msvc64\base\include" include="G:\QBITTORRENT\boost_1_71_0\boost_1_71_0" library-path="G:\QBITTORRENT\install_msvc64\base\lib" library-path="G:\QBITTORRENT\boost_1_71_0\boost_1_71_0\stage\lib" --prefix="G:\QBITTORRENT\install_msvc64\base" cxxflags="-O1 -Gy -Gw -GL" define=BOOST_ASIO_DISABLE_CONNECTEX linkflags="/NOLOGO /DYNAMICBASE /NXCOMPAT /LTCG /OPT:REF /OPT:ICF=5 /MANIFEST:EMBED /INCREMENTAL:NO" --hash -j N install
六、编译Qt源码
1、解压qt-everywhere-src-5.13.2.zip。
2、进入Qt源码目录,如“cd G:\QBITTORRENT\qt-everywhere-src-5.13.2\qt-everywhere-src-5.13.2”。
3、按照下面的说明修改qtbase/mkspecs/common/msvc-desktop.conf文件。
32位:
QMAKE_CFLAGS_RELEASE = -O1 -Oy- -Gy -Gw -GL -MT
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O1 -Oy- -Gy -Gw -GL -MT -Zi
64位:
QMAKE_CFLAGS_RELEASE = -O1 -Gy -Gw -GL -MT
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O1 -Gy -Gw -GL -MT -Zi
32位和64位:
QMAKE_CFLAGS_DEBUG = -Zi -MTd
QMAKE_LFLAGS = /NOLOGO /DYNAMICBASE /NXCOMPAT /LTCG
QMAKE_LFLAGS_RELEASE = /DEBUG /OPT:REF /OPT:ICF=5 /MANIFEST:EMBED /INCREMENTAL:NO /NODEFAULTLIB:MSVCRT
QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF /OPT:ICF=5 /INCREMENTAL:NO
4、执行下面的命令配置Qt源码:
32位:
configure -prefix G:\QBITTORRENT\install_msvc32\qt5 -I G:\QBITTORRENT\install_msvc32\base\include -L G:\QBITTORRENT\install_msvc32\base\lib -platform win32-msvc -release -opensource -confirm-license -strip -no-shared -static -static-runtime -ltcg -make libs -make tools -nomake examples -no-compile-examples -no-dbus -no-icu -system-zlib -openssl-linked -no-gtk -no-opengl -no-opengles3 -no-angle -no-sql-sqlite -no-sql-odbc -no-sqlite -skip qt3d -skip qtactiveqt -skip qtandroidextras -skip qtcanvas3d -skip qtcharts -skip qtconnectivity -skip qtdatavis3d -skip qtdeclarative -skip qtdoc -skip qtgamepad -skip qtgraphicaleffects -skip qtimageformats -skip qtlocation -skip qtmacextras -skip qtmultimedia -skip qtnetworkauth -skip qtpurchasing -skip qtquickcontrols -skip qtquickcontrols2 -skip qtremoteobjects -skip qtscript -skip qtscxml -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtspeech -skip qtvirtualkeyboard -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebglplugin -skip qtwebsockets -skip qtwebview -skip qtx11extras -skip qtxmlpatterns ZLIB_LIBS="-lzlib" OPENSSL_LIBS="-lzlib -llibcrypto -llibssl -lgdi32 -luser32 -lws2_32 -lAdvapi32 -lCrypt32"
64位:
configure -prefix G:\QBITTORRENT\install_msvc64\qt5 -I G:\QBITTORRENT\install_msvc64\base\include -L G:\QBITTORRENT\install_msvc64\base\lib -platform win32-msvc -release -opensource -confirm-license -strip -no-shared -static -static-runtime -ltcg -make libs -make tools -nomake examples -no-compile-examples -no-dbus -no-icu -system-zlib -openssl-linked -no-gtk -no-opengl -no-opengles3 -no-angle -no-sql-sqlite -no-sql-odbc -no-sqlite -skip qt3d -skip qtactiveqt -skip qtandroidextras -skip qtcanvas3d -skip qtcharts -skip qtconnectivity -skip qtdatavis3d -skip qtdeclarative -skip qtdoc -skip qtgamepad -skip qtgraphicaleffects -skip qtimageformats -skip qtlocation -skip qtmacextras -skip qtmultimedia -skip qtnetworkauth -skip qtpurchasing -skip qtquickcontrols -skip qtquickcontrols2 -skip qtremoteobjects -skip qtscript -skip qtscxml -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtspeech -skip qtvirtualkeyboard -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebglplugin -skip qtwebsockets -skip qtwebview -skip qtx11extras -skip qtxmlpatterns ZLIB_LIBS="-lzlib" OPENSSL_LIBS="-lzlib -llibcrypto -llibssl -lgdi32 -luser32 -lws2_32 -lAdvapi32 -lCrypt32"
编译Qt所生成的静态库和头文件将保存到G:\QBITTORRENT\install_msvc32\qt5(32位)目录。
5、可以使用nmake或jom编译Qt,但nmake只支持单线程编译,所以这里使用jom程序来编译,以加快编译速度。下载jom_1_1_3.zip并解压,然后将其中的jom.exe文件拷贝到G:\QBITTORRENT\qt-everywhere-src-5.13.2\qt-everywhere-src-5.13.2目录下。执行下面所示的命令编译及安装Qt(其中“-j N”中N的意义与第四步骤相同):
jom -j N
jom -j N install
七、安装Qt Creator并配置构建套件
1、安装Qt Creator,我们这里是通过qt-opensource-windows-x86-5.13.0.exe安装程序安装,Qt Creator的版本为Qt Creator 4.9.1 (Enterprise)。
2、启动Qt Creator并选择“工具->选项”菜单。
3、在第2步骤所弹出的对话框中,选择“Kits”选项,然后选择其中的“Qt Versions”标签,最后点击右上角的“添加”按钮,添加我们所制作的qmake.exe(或)并将其命名为“Qt 5.13.2 MSVC2017 32bit”或“Qt 5.13.2 MSVC2017 64bit”。点击左下角“Apply”按钮保存变更。
4、在同一对话框,选择“构建套件(Kit)”标签。点击右上角的“添加”按钮,在弹出的对话框中,在“Qt version”的下拉列表中,选择第3步骤所设置的Qt版本,如“Qt 5.13.2 MSVC2017 32bit”或“Qt 5.13.2 MSVC2017 64bit”。将该构件套件命名为“Desktop Qt 5.13.2 MSVC2017 32bit”或“Desktop Qt 5.13.2 MSVC2017 64bit”。对于编译32位的程序,“Compiler”的C或C++的编译器都选择“Microsoft Visual C++ Compiler 15.0 (x86)”。设置完成后,点击“Apply”按钮保存变更。
八、编译qBittorrent
1、解压qbittorrent-4.2.5.tar.gz。
2、重命名conf.pri.windows为conf.pri,打开它并按照下面的说明修改其中的某些内容,如下所示(说明中所用的路径为32位的程序,64位的则改为相应的路径):
(1)、修改INCLUDEPATH的值,多余的INCLUDEPATH选项则删除。
INCLUDEPATH += $$quote(G:/QBITTORRENT/boost_1_71_0/boost_1_71_0)
INCLUDEPATH += $$quote(G:/QBITTORRENT/install_msvc32/base/include)
INCLUDEPATH += $$quote(G:/QBITTORRENT/install_msvc32/qt5/include)
(2)、修改依赖库的路径,多余的则删除。
LIBS += $$quote(-LG:/QBITTORRENT/boost_1_71_0/boost_1_71_0/stage/lib)
LIBS += $$quote(-LG:/QBITTORRENT/install_msvc32/base/lib)
LIBS += $$quote(-LG:/QBITTORRENT/install_msvc32/qt5/lib)
(3)、编译32位的release版本的qBittorrent,则如下修改libboost_system静态库的文件名。
CONFIG(debug, debug|release) {
LIBS += libtorrentd.lib \
libboost_system-vc140-mt-sgd-1_64.lib
}
else {
LIBS += libtorrent.lib \
libboost_system-vc141-mt-s-x32-1_71.lib
}
(4)、注释掉如下这行,否则在链接时会产生“LINK : fatal error LNK1181: 无法打开输入文件libeay32.lib”的错误。
#LIBS += libeay32.lib ssleay32.lib
3、启动Qt Creator并打开G:\QBITTORRENT\qbittorrent-4.2.5\qbittorrent-4.2.5\qbittorrent.pro项目文件。选择我们所设置的构建套件。
4、在“项目”的“构建设置”中,选择“Release”。
5、选择“构建”->“构建项目qbittorrent”菜单,编译qBittorrent。
6、最后生成的程序qbittorrent.exe 存储在G:\QBITTORRENT\qbittorrent-4.2.5\build-qbittorrent-Desktop_Qt_5_13_2_MSVC2017_32bit-Release\src\release目录下。qbittorrent.exe是单一文件的可执行程序。
九、Qt编译补充说明
1、所有Qt Sql Drivers会根据系统中的情况自动判断是否编译。比如将-no-sql-sqlite和-no-sqlite配置选项去掉,则编译成功之后的Qt库就会支持sqlite数据库的访问。再比如,在编译所用的Windows系统中安装MySQL Server,并将它的安装路径配置到选项中(比如MYSQL_PREFIX="C:\Program Files (x86)\MySQL\MySQL Server 5.7"),则Qt库就会支持MySql数据库的访问。
2、编译Qt Tools的QDoc需要LLVM的支持,因此在编译所用的Windows系统中需要安装LLVM,并将它的安装路径设置到LLVM_INSTALL_DIR环境变量中,然后(可能需要重启编译所用的命令行终端)使用configure脚本重新配置Qt源码,则QDoc功能就会被编译进静态库中。
3、以下是比第六步骤编译更多功能的配置选项,如下所示:
configure -prefix G:\QBITTORRENT\install_msvc32\qt5 -I G:\QBITTORRENT\install_msvc32\base\include -L G:\QBITTORRENT\install_msvc32\base\lib -platform win32-msvc -release -opensource -confirm-license -strip -no-shared -static -static-runtime -ltcg -make libs -make tools -nomake examples -no-compile-examples -no-icu -system-zlib -openssl-linked -no-gtk -no-opengl -no-opengles3 -no-angle -qt-sqlite -skip qt3d -skip qtactiveqt -skip qtandroidextras -skip qtcanvas3d -skip qtcharts -skip qtconnectivity -skip qtdatavis3d -skip qtdeclarative -skip qtgamepad -skip qtgraphicaleffects -skip qtimageformats -skip qtlocation -skip qtmacextras -skip qtmultimedia -skip qtnetworkauth -skip qtpurchasing -skip qtquickcontrols -skip qtquickcontrols2 -skip qtremoteobjects -skip qtscript -skip qtscxml -skip qtsensors -skip qtserialbus -skip qtspeech -skip qtvirtualkeyboard -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebglplugin -skip qtwebsockets -skip qtwebview -skip qtx11extras -skip qtxmlpatterns ZLIB_LIBS="-lzlib" OPENSSL_LIBS="-lzlib -llibcrypto -llibssl -lgdi32 -luser32 -lws2_32 -lAdvapi32 -lCrypt32" -recheck-all MYSQL_PREFIX="C:\Program Files (x86)\MySQL\MySQL Server 5.7"