Main  /  Edit version 21  /  Edit version 22  /   /  Users Area

Difference "Building CppCMS using Visual Studio" ver. 21 versus ver. 22

Content:

<!--toc-->
## Introduction
In general build on Windows using Microsoft Visual Studio is quite complex due to several factors:
1. Lack of easily accessible already build libraries in both debug and release variants for your MSVC version
2. Need of strict debug/release separation
So in order to make your life while building CppCMS simpler I suggest following rules:
1. Keep strict separation of debug and release installations and 32/64 bit architectures, for example
c:\cppcms_deps\x64\Debug
c:\cppcms_deps\x64\Release
c:\cppcms_deps\x86\Debug
c:\cppcms_deps\x86\Release
Note: pcre, icu and zlib support debug/release mangling of the libraries/dlls for debug/release flavor, but OpenSSL does not. So I strongly recommend to use separate trees to ensure safety.
2. When building with CMake always use "NMake Makefiles" generator to prevent collisions of debug/release methods
3. Start from basic dependencies zlib and pcre that can be built using CMake than go with more complex ones like OpenSSL and ICU if needed.
## Before We Begin
## Building Dependencies
1. Install Visual Studio or Visual Studio build tools
2. Install CMake, make sure it is in global path
3. Install Python 2.x version, make sure it is in global path
4. Optionally install git if you want to build upstream branches.
Checks: open cmd and try to run cmake, python and optionally git - see if it works.
And finally make sure the directories you are building in are not scanned by anti-virus - otherwise you may get some build failures - due to files being locked by AV.
Note: in all builds we will use Visual Studio console - open one for correct architecture.
For example:
- MSVC 2017 64 bit builds open: `x64 Native Tools Command Prompt for VS 2017`
- MSVC 2017 32 bit builds open: `x86 Native Tools Command Prompt for VS 2017`
I assume during this tutorial that you work in one of such a consoles.
## Mandatory Dependencies
### PCRE
PCRE comes with CMake build system, however building it correctly may be somewhat tricky.
Download the latest version of PCRE 8.x. Do not use PCRE2, it isn't supported.
Important options to note:
1. Use "NMake Makefiles" generator, default generator is multi flavor one and much harder to use properly.
2. Make sure you **explicitly** specify Release/Debug flavor `-DCMAKE_BUILD_TYPE=Release`
3. Build Shared version of PCRE (i.e. dll) `-DBUILD_SHARED_LIBS=ON`
4. Make sure you put `-DPCRE_SUPPORT_UNICODE_PROPERTIES=ON` option on to enable utf-8 support - otherwise regex tests will fail
Step by step in the console:
Release:
cd \path\to\pcre\soures
mkdir msvc-release-x64
cd msvc-release-x64
cmake -DBUILD_SHARED_LIBS=ON -DPCRE_SUPPORT_UNICODE_PROPERTIES=ON -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=c:\cppcms_deps\x64\Release ..
cmake -DBUILD_SHARED_LIBS=ON ^
-DPCRE_SUPPORT_UNICODE_PROPERTIES=ON ^
-G"NMake Makefiles" ^
-DCMAKE_BUILD_TYPE=Release ^
-DCMAKE_INSTALL_PREFIX=c:\cppcms_deps\x64\Release ^
..
nmake
nmake install
cd ..
Debug:
cd \path\to\pcre\soures
mkdir msvc-debug-x64
cd msvc-debug-x64
cmake -DBUILD_SHARED_LIBS=ON -DPCRE_SUPPORT_UNICODE_PROPERTIES=ON -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=c:\cppcms_deps\x64\Debug ..
cmake -DBUILD_SHARED_LIBS=ON ^
-DPCRE_SUPPORT_UNICODE_PROPERTIES=ON ^
-G"NMake Makefiles" ^
-DCMAKE_BUILD_TYPE=Debug ^
-DCMAKE_INSTALL_PREFIX=c:\cppcms_deps\x64\Debug ^
..
nmake
nmake install
cd ..
### zlib
Fortunately latest zlib versions come with CMake support making it much easier to build with Visual Studio.
1. Use "NMake Makefiles" generator, default generator is multi version and much trickier to use.
2. Make sure you **explicitly** specify Release/Debug flavor `-DCMAKE_BUILD_TYPE=Release`
2. Build Shared version of zlib (i.e. dll) `-DBUILD_SHARED_LIBS=ON`
Step by step:
Open Visual studio command prompt, for example `x64 Native Tools Command Prompt for VS 2017` or `x86 Native Tools Command Prompt for VS 2017` and change directory to location of zlib sources. Create build directory and run the commands:
For example for x64 build
Release
mkdir msvc-release-x64
cd msvc-release-x64
cmake -DBUILD_SHARED_LIBS=ON -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=c:\cppcms_deps\x64\Release ..
cmake -DBUILD_SHARED_LIBS=ON ^
-G"NMake Makefiles" ^
-DCMAKE_BUILD_TYPE=Release ^
-DCMAKE_INSTALL_PREFIX=c:\cppcms_deps\x64\Release ^
..
nmake
nmake install
cd ..
Debug
mkdir msvc-debug-x64
cd msvc-debug-x64
cmake -DBUILD_SHARED_LIBS=ON -G"NMake Makefiles" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=c:\cppcms_deps\x64\Debug ..
cmake -DBUILD_SHARED_LIBS=ON ^
-G"NMake Makefiles" ^
-DCMAKE_BUILD_TYPE=Debug ^
-DCMAKE_INSTALL_PREFIX=c:\cppcms_deps\x64\Debug ^
..
nmake
nmake install
cd ..
### Checking the build results.
After installation of PCRE and zlib you need to get structure like this:
c:\cppcms_deps\x64\Release
c:\cppcms_deps\x64\Release\include
c:\cppcms_deps\x64\Release\include\zlib.h
c:\cppcms_deps\x64\Release\include\pcre.h
...
c:\cppcms_deps\x64\Release\lib
c:\cppcms_deps\x64\Release\lib\zlib.lib
c:\cppcms_deps\x64\Release\lib\pcre.lib
...
c:\cppcms_deps\x64\Release\bin
c:\cppcms_deps\x64\Release\bin\zlib1.dll
c:\cppcms_deps\x64\Release\bin\pcre.dll
...
c:\cppcms_deps\x64\Debug
c:\cppcms_deps\x64\Debug\include
c:\cppcms_deps\x64\Debug\include\zlib.h
c:\cppcms_deps\x64\Debug\include\pcre.h
...
c:\cppcms_deps\x64\Debug\lib
c:\cppcms_deps\x64\Debug\lib\zlibd.lib
c:\cppcms_deps\x64\Debug\lib\pcred.lib
...
c:\cppcms_deps\x64\Debug\bin
c:\cppcms_deps\x64\Debug\bin\zlibd1.dll
c:\cppcms_deps\x64\Debug\bin\pcred.dll
Note - the DLLs and libs with "d" suffix are placed in debug location.
## Optional Dependencies
### OpenSSL
*Warning:* OpenSSL does not mangle its Debug and Release flavors - so make sure you have a separate install prefix for two OpenSSL flavors and never mix them!
First of all you need to install perl as it is basic building and configuration tool. ActivePerl is recommended. Make sure it is in system path. Note: msys2 perl or cygwin perl does not work.
Note: Make sure you open correct MSVC console for x64 and x86 builds.
For 64 bit release build run the command:
perl Configure VC-WIN64A no-asm --prefix=c:\cppcms_deps\x64\Release --openssldir=c:\cppcms_deps\x64\Release
perl Configure VC-WIN64A no-asm ^
--prefix=c:\cppcms_deps\x64\Release ^
--openssldir=c:\cppcms_deps\x64\Release
For 64 bit debug build run the command
perl Configure debug-VC-WIN64A no-asm --prefix=c:\cppcms_deps\x64\Release --openssldir=c:\cppcms_deps\x64\Release
perl Configure debug-VC-WIN64A no-asm ^
--prefix=c:\cppcms_deps\x64\Release ^
--openssldir=c:\cppcms_deps\x64\Release
For 32 bit release build run the command:
perl Configure VC-WIN32 no-asm --prefix=c:\cppcms_deps\x86\Release --openssldir=c:\cppcms_deps\x86\Release
perl Configure VC-WIN32 no-asm ^
--prefix=c:\cppcms_deps\x86\Release ^
--openssldir=c:\cppcms_deps\x86\Release
For 32 bit debug build run the command
perl Configure debug-VC-WIN32 no-asm --prefix=c:\cppcms_deps\x86\Debug --openssldir=c:\cppcms_deps\x86\Debug
perl Configure debug-VC-WIN32 no-asm ^
--prefix=c:\cppcms_deps\x86\Debug ^
--openssldir=c:\cppcms_deps\x86\Debug
Afterwards run:
nmake
nmake install
And between flavors make sure you run
nmake distclean
Notes:
- `VC-WIN64A` and `debug-VC-WIN64A` are 64 bit build flavors for release and debug
- `VC-WIN32` and `debug-VC-WIN32` are32 bit build flavors for release and debug
- no-asm - disable NASM dependency - not really needed
- `--prefix` and `--openssldir` are location of build results
### ICU
Several notes before building ICU on Windows.
1. Don't use official builds from ICU website - it does not contain debug version and are build for only 1 specific MSVC versions.
2. You can try get ready libraries there: <https://www.npcglib.org/~stathis/blog/precompiled-icu/> however the site by not be updated or have variants for your version of MSVC.
3. If you build ICU use cygwin/MSVC combination, do not use provided MSVC solution.
#### Using Downloadable binaries
You can get them there: <https://www.npcglib.org/~stathis/blog/precompiled-icu>
You need to put the include/bin/lib files to your tree according to correct paths debug/release and 32/64 bit. For example copy following:
Headers:
icu-59.1-vs2017/include/unicode ->
c:\cppcms_deps\x64\Release\include\unicode
c:\cppcms_deps\x64\Debug\include\unicode
c:\cppcms_deps\x86\Release\include\unicode
c:\cppcms_deps\x86\Debug\include\unicode
Import Libraries:
icu-59.1-vs2017/include/lib/*d.lib ->
c:\cppcms_deps\x86\Debug\lib
icu-59.1-vs2017/include/lib/*.lib -> # without d
c:\cppcms_deps\x86\Release\lib
icu-59.1-vs2017/include/lib64/*d.lib ->
c:\cppcms_deps\x64\Debug\lib
icu-59.1-vs2017/include/lib64/*.lib -> # without d
c:\cppcms_deps\x64\Release\lib
DLLs:
icu-59.1-vs2017/include/bin/*d59.dll ->
c:\cppcms_deps\x86\Debug\bin
icu-59.1-vs2017/include/bin/*59.dll -> # without d
c:\cppcms_deps\x86\Release\bin
icu-59.1-vs2017/include/bin64/*d59.dll ->
c:\cppcms_deps\x64\Debug\bin
icu-59.1-vs2017/include/bin64/*59.dll -> # without d
c:\cppcms_deps\x64\Release\bin
This may save you the hassle of building ICU.
#### Building ICU
Note instructions are based on instructions from there: <https://wiki.qt.io/Compiling-ICU-with-MSVC>
Steps to build:
1. Download icu-xx-src.zip. Note **zip**, not _tgz_. The tgz does not contain all files for Windows build
2. Install cygwin - only basic packages are needed: `make`, `dos2unix` and `binutils`.
3. Open Visual Studio console and configure path to location of cygwin\bin directory, so bash and other tools will be accessible:
set PATH=%PATH%;c:\cygwin\bin
This way you can run cygwin commands from MSVC command line
3. Go to source directory of the icu package and fix line encodings, otherwise bash will not work:
dos2unix *
dos2unix -f configure
4. For release build run:
bash runConfigureICU Cygwin/MSVC --prefix=/cygdrive/c/cppcms_deps/x64/Release
bash runConfigureICU ^
Cygwin/MSVC ^
--prefix=/cygdrive/c/cppcms_deps/x64/Release
make
make install
make distclean
Distclean will allow to run debug configuration smoothly. Node cygwin style path to installation location: `/cygdrive/c/cppcms_deps/x64/Release`
5. For debug build run
bash runConfigureICU --enable-debug --disable-release Cygwin/MSVC --prefix=/cygdrive/c/cppcms_deps/x64/Debug
bash runConfigureICU ^
--enable-debug --disable-release ^
Cygwin/MSVC ^
--prefix=/cygdrive/c/cppcms_deps/x64/Debug
make
make install
make distclean
Note `--enable-debug --disable-release` must go **before** `Cygwin/MSVC` - otherwise you'll get release binaries
6. Note, the installation script installs dlls to the same location as lib, so you need to move them from `c:\cppcms_deps\x64\(Release|Debug)\lib` to `c:\cppcms_deps\x64\(Release|Debug)\bin`
Now you have working ICU.
## Building CppCMS
Several notes when building using MSVC:
1. Only "NMake Makefiles" generator is supported
2. You need to specify `-DCMAKE_BUILD_TYPE=Debug` or `-DCMAKE_BUILD_TYPE=RelWithDebInfo` explicitly since default is Debug for MSVC.
2. You also recommend to add `-DDISABLE_STATIC=ON` since on Windows only dll version allows to build dynamically loadable views and use plugins.
So open the VS console, go to cppcms source directory and run configuration and build:
### Release
Release build
mkdir msvc-x64-rel
cd msvc-x64-rel
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=RelWithDebInfo -DDISABLE_STATIC=ON -DCMAKE_INCLUDE_PATH=c:\cppcms_deps\x64\Release\include -DCMAKE_LIBRARY_PATH=c:\cppcms_deps\x64\Release\lib -DCMAKE_INSTALL_PREFIX=c:\cppcms_deps\x64\Release ..
cmake -G "NMake Makefiles" ^
-DCMAKE_BUILD_TYPE=RelWithDebInfo ^
-DDISABLE_STATIC=ON ^
-DCMAKE_INCLUDE_PATH=c:\cppcms_deps\x64\Release\include ^
-DCMAKE_LIBRARY_PATH=c:\cppcms_deps\x64\Release\lib ^
-DCMAKE_INSTALL_PREFIX=c:\cppcms_deps\x64\Release ^
..
nmake
Testing:
set PATH=%PATH%;c:\cppcms_deps\x64\Release\bin;.\booster\
nmake test
Installation:
nmake install
### Debug
Debug build
mkdir msvc-x64-rel
mkdir msvc-x64-deb
cd msvc-x64-deb
cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Debug -DDISABLE_STATIC=ON -DCMAKE_INCLUDE_PATH=c:\cppcms_deps\x64\Debug\include -DCMAKE_LIBRARY_PATH=c:\cppcms_deps\x64\Debug\lib -DCMAKE_INSTALL_PREFIX=c:\cppcms_deps\x64\Debug ..
cmake -G "NMake Makefiles" ^
-DCMAKE_BUILD_TYPE=Debug^
-DDISABLE_STATIC=ON ^
-DCMAKE_INCLUDE_PATH=c:\cppcms_deps\x64\Debug\include ^
-DCMAKE_LIBRARY_PATH=c:\cppcms_deps\x64\Debug\lib ^
-DCMAKE_INSTALL_PREFIX=c:\cppcms_deps\x64\Debug ^
..
nmake
Testing:
set PATH=%PATH%;c:\cppcms_deps\x64\Debug\bin;.\booster\
nmake test
Installation:
nmake install
And now start development using CppCMS
## References
1. <http://developer.covenanteyes.com/building-openssl-for-visual-studio/>
2. <https://wiki.qt.io/Compiling-ICU-with-MSVC>
3. <https://www.npcglib.org/~stathis/blog/precompiled-icu/>

About

CppCMS is a web development framework for performance demanding applications.

Support This Project

SourceForge.net Logo

Поддержать проект

CppCMS needs You


Navigation

Main Page


Valid CSS | Valid XHTML 1.0