wiki/Compilation-MSVC-2017-(x86_64)-(static-linkage).mediawiki
2024-05-01 17:18:06 +08:00

153 lines
14 KiB
Plaintext

This page describes how to compile 64-bit qBittorrent using MSVC 2017 under Windows. This is tested under Windows 7 SP1 64-bit but it should work the same under any other Windows version. Here the Community Edition of MSVC 2017 was used but any other edition must behave the same.
=== What you will need: ===
* The MSVC 2017 compiler. The Community Edition(free) will do fine.
* A [https://www.python.org/downloads/windows/ python] interpreter. Make sure it is added to the path.
* A [https://www.perl.org/ Perl language] interpreter. [http://strawberryperl.com/ Strawberry Perl] will do fine.
* Latest release of the [https://www.nasm.us/ NASM assembler].
* Latest release of [https://www.zlib.net/ Zlib].
* Latest release of [https://www.openssl.org/ OpenSSL].
* Latest release of the [https://www.boost.org/ Boost libraries]. Currently tested only with boost 1.68.
* Latest release of [https://www.libtorrent.org/ libtorrent(rasterbar)]. Currently tested with libtorrent(rasterbar) 1.1.9
* Latest release of the [https://download.qt.io/official_releases/qt/ Qt libraries] source. Currently tested only with Qt Everywhere '''5.9.6'''.
* Latest release of [https://www.qbittorrent.org qBittorrent].
* [https://download.qt.io/official_releases/qtcreator/ Qt Creator].
=== Info that applies to all steps ===
* Let's assume that the working directory for our compilation will be <code>G:\QBITTORRENT</code>
* You need to use the '''64-bit''' version of the compiler. All commands will be issued in that command shell. Open it via <code>Start->All Programs->Visual Studio 2017->Visual Studio Tools->VC->x64 Native Tools Command Prompt for VS 2017</code>
* The above prompt will open and will use a path under the <code>C:\</code> drive. If you want to use another drive for compilation (like mentioned above) you need to switch to that. Simply issuing <code>G:</code> (or any other drive letter) will switch there.
* When you want to change paths in the prompt you do it by issuing <code>cd new-path</code>. '''NOTE:''' If the path starts with a different drive letter you need to switch to that first. The <code>cd</code> command doesn't do it automatically.
* We will use 3 installation paths:
** <code>G:\QBITTORRENT\install_msvc64\base</code> will be used for installing all necessary libs except Qt5
** <code>G:\QBITTORRENT\install_msvc64\base\qt5</code> will be used for installing qt5
* In general these compiler/linker flags will be used:
** '''Compiler:''' -O1 -Gy -Gw -GL -MT
** '''Linker:''' /NOLOGO /DYNAMICBASE /NXCOMPAT /LTCG /OPT:REF /OPT:ICF /MANIFEST:EMBED /INCREMENTAL:NO /NODEFAULTLIB:MSVCRT
=== Compiling Zlib ===
* Extract the Zlib source inside our working dir.
* Navigate to the Zlib source folder. eg <code>cd G:\QBITTORRENT\zlib-1.2.11</code>
* Edit the '''win32/Makefile.msc''' file. Find the CFLAGS and LDFLAGS variables and replace them with these:
CFLAGS = -nologo -O1 -Gy -Gw -GL -MT $(LOC)
LDFLAGS = /NOLOGO /DYNAMICBASE /NXCOMPAT /LTCG /OPT:REF /OPT:ICF /MANIFEST:EMBED /INCREMENTAL:NO /NODEFAULTLIB:MSVCRT
* Issue the following commands:
nmake -f win32/Makefile.msc AS=ml64 LOC="-DASMV -DASMINF -I." OBJA="inffasx64.obj gvmat64.obj inffas8664.obj"
* Copy zlib.h, zconf.h, zlib.lib to our install dir.
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\
=== Compiling OpenSSL ===
* Make sure you have installed perl and nasm. Use <code>nasm -v</code> to check NASM version, then if not found:
"C:\Program Files\NASM\nasmpath.bat"
* Extract the OpenSSL source inside our working dir.
* Navigate to the OpenSSL source folder. eg ''cd G:\QBITTORRENT\openssl-1.0.2k''
* Now we will build a static version of OpenSSL. Issue the following commands:
perl Configure VC-WIN64A no-shared zlib no-zlib-dynamic threads --openssldir=C:\openssl --prefix=G:\QBITTORRENT\install_msvc64\base -IG:\QBITTORRENT\install_msvc64\base\include -LG:\QBITTORRENT\install_msvc64\base\lib
ms\do_win64a
* '''NOTE:''' Using the <code>--openssldir</code> switch is very important. It controls the path that will get hardcoded into openssl when it looks for the file <code>openssl.cnf</code>. Otherwise openssl will use the prefix path. If that path is on any other drive other than C: it will cause weird problems for '''some''' of the end users. If users have assigned to G: (or any other letter you used) a card reader/cdrom/dvdrom that doesn't have a card/cd/dvd plugged in they will get a cryptic message saying <code>There is no disk in the drive. Please insert a disk into drive G:</code>. See issue [https://github.com/qbittorrent/qBittorrent/issues/4190 #4190]. So for that reason we use a dummy path under drive C: which is always available.
* Edit the ''ms\nt.mak'' file and find the line that says:
EX_LIBS=/libpath::\QBITTORRENT\install_msvc\base\lib ws2_32.lib gdi32.lib advapi32.lib crypt32.lib user32.lib zlib1.lib
* Replace '''zlib1.lib''' with '''zlib.lib'''
* Find the '''CFLAG''' variable and append:
-O1 -Gy -Gw -GL -MT
* Delete the values of '''APP_CFLAG''' and '''LIB_CFLAG'''
* Find line that says:
LFLAGS=/nologo /subsystem:console /opt:ref /debug
* And replace it with:
LFLAGS=/NOLOGO /SUBSYSTEM:CONSOLE /DYNAMICBASE /NXCOMPAT /LTCG /OPT:REF /OPT:ICF /MANIFEST:EMBED /INCREMENTAL:NO /NODEFAULTLIB:MSVCRT
* Then issue the following:
nmake -f ms\nt.mak
nmake -f ms\nt.mak install
=== Compiling Boost ===
* Extract the Boost sources in the working dir.
* Navigate to the Boost source folder. eg ''cd G:\QBITTORRENT\boost_1_68_0''
* Now you will need to bootstrap Boost so it will build b2.exe(previously bjam.exe). Issue the following command:
bootstrap.bat
* Compile a static version of Boost. Issue the following command. You can replace %NUMBER_OF_PROCESSORS% in <code>-j %NUMBER_OF_PROCESSORS%</code> with a different number of threads you want b2 to use when compiling:
b2 -q --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 /MANIFEST:EMBED /INCREMENTAL:NO" --hash -j %NUMBER_OF_PROCESSORS%
* Install (it take a while to copy the numerous files):
b2 -q --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 /MANIFEST:EMBED /INCREMENTAL:NO" --hash -j %NUMBER_OF_PROCESSORS% install
=== Compiling Libtorrent ===
* Extract the Libtorrent sources in the working dir.
* Navigate to the Libtorrent source folder. eg ''cd G:\QBITTORRENT\libtorrent-rasterbar-1.1.9''
* Copy the b2.exe from the Boost directory to the Libtorrent directory
copy ..\boost_1_68_0\b2.exe b2.exe
* Compile a static version of Libtorrent. Issue the following command. You can replace %NUMBER_OF_PROCESSORS% in <code>-j %NUMBER_OF_PROCESSORS%</code> with a different number of threads you want b2 to use when compiling:
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 logging=off resolve-countries=off dht=on character-set=unicode boost-link=static -sBOOST_ROOT="G:\QBITTORRENT\boost_1_68_0" 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" define=BOOST_ASIO_DISABLE_CONNECTEX linkflags="/NOLOGO /DYNAMICBASE /NXCOMPAT /LTCG /OPT:REF /OPT:ICF /MANIFEST:EMBED /INCREMENTAL:NO" --hash -j %NUMBER_OF_PROCESSORS%
* Install:
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 logging=off resolve-countries=off dht=on character-set=unicode boost-link=static -sBOOST_ROOT="G:\QBITTORRENT\boost_1_68_0" 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" define=BOOST_ASIO_DISABLE_CONNECTEX linkflags="/NOLOGO /DYNAMICBASE /NXCOMPAT /LTCG /OPT:REF /OPT:ICF /MANIFEST:EMBED /INCREMENTAL:NO" --hash -j %NUMBER_OF_PROCESSORS% install
=== Compiling Qt5 ===
* Extract the Qt sources in the working dir.
* Navigate to the Qt source folder. eg ''cd G:\QBITTORRENT\qt-everywhere-opensource-src-5.9.6''
* Now we will build a static version of Qt and make it as small as possible.
* Open '''qtbase/mkspecs/common/msvc-desktop.conf''' and replace the relevant lines with:
QMAKE_CFLAGS_RELEASE = -O1 -Gy -Gw -GL -MT
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O1 -Gy -Gw -GL -MT -Zi
QMAKE_CFLAGS_DEBUG = -Zi -MTd
QMAKE_LFLAGS = /NOLOGO /DYNAMICBASE /NXCOMPAT /LTCG
QMAKE_LFLAGS_RELEASE = /OPT:REF /OPT:ICF /MANIFEST:EMBED /INCREMENTAL:NO /NODEFAULTLIB:MSVCRT
QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF /OPT:ICF /INCREMENTAL:NO
* Issue the following command:
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-qml-debug -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 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 qtwebsockets -skip qtwebview -skip qtx11extras -skip qtxmlpatterns ZLIB_LIBS="-lzlib" OPENSSL_LIBS="-llibeay32 -lssleay32"
* Now you have 2 choices for compiling. Using <code>nmake</code> or <code>jom</code>. nmake uses only one core for compilation. That means that the qt compilation will take hours. On the other hand jom can use multiple cores/threads for faster compilation. Download it from [https://download.qt.io/official_releases/jom/ here]. Extract the jom.exe to the qt source dir and just issue(your can replace %NUMBER_OF_PROCESSORS% if you want with a different number of threads to use):
jom -j %NUMBER_OF_PROCESSORS%
* Now install:
jom -j %NUMBER_OF_PROCESSORS% install
=== Install and Configure Qt Creator ===
* Just follow the installer instructions for the installation.
* Launch Qt Creator and select Tools->Options...
* Select the '''Build & Run''' item from the left and select the '''Qt Versions''' tab.
* Click the '''Add...''' button and select the qmake.exe you just build. It should be in '''G:\QBITTORRENT\install_msvc64\qt5\bin\qmake.exe'''
* Name it something meaningful like "Qt5 msvc2017 x64"
* Apply the changes
* Click the '''Kits''' tab
* Click the '''Add''' button. Choose a name eg Qt5 msvc2017 x64. Also choose a Qt version and a compiler from the drop down menus. Be sure to select the 64-bit(amd64) version of the compiler. Click Apply.
* If you have configured multiple kits, then select the one you want as default and click the button '''Make Default''' and click OK. Otherwise, just close the dialog now.
=== Compiling qBittorrent ===
* Extract the qBittorrent sources in the working dir.
* Launch Qt Creator and open the ''qbittorrent.pro'' file in ''G:\QBITTORRENT\qbittorrent-4.1.2''
* From the Window that pops up select the Qt version you added above and specify '''release''' version. Also check the ''Use Shadow Building'' checkbox. You can also select where qBittorrent will be built if you want.
* If you are compiling qBittorrent <code>v3_3_x</code> branch, open the ''winconf.pri'' file and adjust the paths. If <code>v4_0_x</code> branch is used, open ''conf.pri.windows'', save it as ''conf.pri'' and adjust the paths. Disregard most of the file comments(read next step).
* Edit the first INCLUDEPATH to look like this:
INCLUDEPATH += $$quote(G:/qBittorrent/install_msvc64/base/include)
* Edit the second INCLUDEPATH to look like this(adjust for actual boost name):
INCLUDEPATH += $$quote(G:/qBittorrent/install_msvc64/base/include/boost-1_68)
* Comment the other 2 INCLUDEPATH lines by putting # in front of them.
* Edit the first LIBS to look like this:
LIBS += $$quote(-LG:/qBittorrent/install_msvc64/base/lib)
* Comment the other 3 LIBS lines by putting # in front of them.
* If you are compiling <code>v3_3_x</code> branch, open the ''winconf-msvc.pri'' file and adjust the filename of the lib of Boost. If <code>v4_0_x</code> branch is used, adjust it in ''conf.pri''.
* If you are compiling <code>v4_0_x</code> branch against libtorrent 1.0.x, uncomment the following line in ''conf.pri''
DEFINES += BOOST_ALL_NO_LIB
and comment line by putting # in front of them.
DEFINES += BOOST_ASIO_SEPARATE_COMPILATION
change:
CONFIG(debug, debug|release) {
LIBS += libtorrentd.lib \
libboost_system-vc140-mt-sgd-1_64.lib
}
else {
LIBS += libtorrent.lib \
libboost_system-vc140-mt-s-1_64.lib
}
to
CONFIG(debug, debug|release) {
LIBS += libtorrentd.lib \
libboost_system-vc141-mt-sgd-x64-1_68.lib
}
else {
LIBS += libtorrent.lib \
libboost_system-vc141-mt-s-x64-1_68.lib
}
* Select Build->Build All
* After the compilation ends you should have ''qbittorrent.exe'' in <code><build folder>\src\release</code>. "build folder" is where you chose qBittorrent to be build in the popup window.