Сборка CppCMS с использованием Visual Studio
Введение
В основном, сборка на Windows с использованием Microsoft Visual Studio довольно сложна из-за нескольких факторов:
- Отсутствие легкодоступных уже собранных библиотек как в debug, так и release вариантах для вашей версии MSVC
- Необходимость строгого разделения debug/release
Поэтому, чтобы сделать вашу жизнь при сборке CppCMS проще, предлагаю следующие правила:
Строго разделяйте установки debug и release и 32/64-разрядные архитектуры, например
c:\cppcms_deps\x64\Debug c:\cppcms_deps\x64\Release c:\cppcms_deps\x86\Debug c:\cppcms_deps\x86\Release
Примечание: pcre, icu и zlib поддерживает debug/release коррекцию библиотек/dll для flavor debug/release, но OpenSSL - нет. Поэтому я настоятельно рекомендую использовать отдельные ветки директорий для обеспечения безопасности.
При сборке с CMake всегда используйте генератор "NMake Makefiles", чтобы предотвратить конфликты методов debug/release
- Начните с базовых завистмостей zlib и pcre, которые могут быть собраны с CMake, затем переходите к более сложным, таким как OpenSSL или ICU при необходимости.
Прежде Чем Начнем
Сборка Зависимостей
- Установите Visual Studio или Visual Studio build tools
- Установите CMake, убедитесь, что он есть в глобальном пути
- Установите Python версии 2.x, убедитесь, что он есть в глобальном пути
- Опционально установите git, если хотите собирать вышестоящие ветки.
Проверки: откройте cmd и попробуйте запустить cmake, python и опционально git - посмотрите, работают ли они.
И, наконец, убедитесь, что директории, в которых вы делаете сборку не сканируются анитивирусом - иначе можете получить некоторые сбои при сборке из-за блокировки файлов AV.
Примечание: во всех сборках мы будем использовать консоль Visual Studio - откройте одну из них с правильной архитектурой.
Например:
- Для 64-битных сборок MSVC 2017 откройте:
x64 Native Tools Command Prompt for VS 2017
- Для 32-битных сборок MSVC 2017 откройте:
x86 Native Tools Command Prompt for VS 2017
Я предполагаю, что во время этого урока вы работаете в одной из таких консолей.
Обязательные зависимости
PCRE
PCRE поставляется с системой сборки CMake, однако собрать ее правильно может быть несколько сложно.
Скачайте последнюю версию PCRE 8.x. Не используйте PCRE2, он не поддерживается.
Важные параметры:
- Используйте генератор "NMake Makefiles" - у генератора по умолчанию множественный flavor и его намного сложнее использовать правильно.
- Убедитесь, что вы явно указываете flavor Release/Debug
-DCMAKE_BUILD_TYPE=Release
- Соберите разделяемую версию PCRE (т.е. dll)
-DBUILD_SHARED_LIBS=ON
- Убедитесь, что включили опцию
-DPCRE_SUPPORT_UNICODE_PROPERTIES=ON
, чтобы включить поддержку utf-8 - иначе не пройдут тесты regex
Пошагово в консоли:
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 ^ .. 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 ^ .. nmake nmake install cd ..
zlib
К счастью, последние версии zlib поставляются с поддержкой CMake, что гораздо упрощает сборку в Visual Studio.
- Используйте генератор "NMake Makefiles", генератор по умолчанию мультиверсионный и его намного сложнее использовать.
- Убедитесь, что явно указываете flavor Release/Debug
-DCMAKE_BUILD_TYPE=Release
- Соберите разделяемую версию zlib (т.е. dll)
-DBUILD_SHARED_LIBS=ON
Пошагово:
Откройте командную строку Visual Studio, например x64 Native Tools Command Prompt for VS 2017
или x86 Native Tools Command Prompt for VS 2017
и смените каталог на расположение источников zlib. Создайте каталог сборки и запустите команды:
Например для сборки x64
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 ^ .. 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 ^ .. nmake nmake install cd ..
Проверка результатов сборки.
После установки PCRE и zlib у вас должна получиться такая структура:
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
Примечание - DLL и библиотеки с суффиксом "d" находятся в пути debug.
Опциональные Зависимости
OpenSSL
Предупреждение: OpenSSL не корректирует flavor Debug и Release - поэтому убедитесь, что у вас отдельный установочный префикс для двух flavor OpenSSL и никогда их не смешивайте!
Прежде всего, вам нужно установить perl, поскольку это базовое средство сборки и настройки. Рекомендуется использовать ActivePerl. Убедитесь, что он находится в системном пути. Примечание: msys2 perl или cygwin perl не работают.
Примечание: Убедитесь, что открыли правильную консоль MSVC для сборок x64 и x86.
Для 64-битной сборки release запустите команду:
perl Configure VC-WIN64A no-asm ^ --prefix=c:\cppcms_deps\x64\Release ^ --openssldir=c:\cppcms_deps\x64\Release
Для 64-битной сборки debug запустите команду:
perl Configure debug-VC-WIN64A no-asm ^ --prefix=c:\cppcms_deps\x64\Release ^ --openssldir=c:\cppcms_deps\x64\Release
Для 32-битной сборки release запустите команду:
perl Configure VC-WIN32 no-asm ^ --prefix=c:\cppcms_deps\x86\Release ^ --openssldir=c:\cppcms_deps\x86\Release
Для 64-битной сборки debug запустите команду:
perl Configure debug-VC-WIN32 no-asm ^ --prefix=c:\cppcms_deps\x86\Debug ^ --openssldir=c:\cppcms_deps\x86\Debug
Затем запустите:
nmake nmake install
И между flavor убедитесь, что запустили
nmake distclean
Примечание:
VC-WIN64A
иdebug-VC-WIN64A
- 64-битные flavor сборки для release и debugVC-WIN32
иdebug-VC-WIN32
- 32-битные flavor сборки для release и debug- no-asm - отключает зависимость NASM - не нужен в действительности
--prefix
и--openssldir
- расположение результатов сборки
ICU
Несколько заметок перед сборкой ICU на Windows.
- Не используйте официальные сборки на веб-сайте ICU - они не содержат debug версию и собраны только для 1 конкретной версии MSVC.
- Вы можете попробовать взять готовые библиотеки здесь: https://www.npcglib.org/~stathis/blog/precompiled-icu/ однако сайт не обновляется или не имеет вариантов для вашей версии MSVC.
- Если вы собираете ICU, используйте комбинацию cygwin/MSVC, не используйте предоставленное решение MSVC.
Использование Скачанных бинарников
Вы можете взять их здесь: https://www.npcglib.org/~stathis/blog/precompiled-icu
Вам нужно поместить файлы include/bin/lib в ваше дерево каталогов в соответствии с правильными путями debug/release и 32/64 бит. Например, скопируйте следующее:
Заголовочные файлы:
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
Библиотеки Импорта:
icu-59.1-vs2017/include/lib/*d.lib -> c:\cppcms_deps\x86\Debug\lib icu-59.1-vs2017/include/lib/*.lib -> # без 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 -> # без d c:\cppcms_deps\x64\Release\lib
DLL:
icu-59.1-vs2017/include/bin/*d59.dll -> c:\cppcms_deps\x86\Debug\bin icu-59.1-vs2017/include/bin/*59.dll -> # без 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 -> # без d c:\cppcms_deps\x64\Release\bin
Это поможет вам сэкономить на хлопотах сборки ICU.
Сборка ICU
Примечание: инструкции основаны на инструкциях отсюда: https://wiki.qt.io/Compiling-ICU-with-MSVC
Шаги для сборки:
- Скачайте icu-xx-src.zip. Заметьте - zip, не tgz. tgz не содержит всех файлов для Windows сборки
- Установите cygwin - нужны только базовые пакеты:
make
,dos2unix
иbinutils
. Откройте консоль Visual Studio и настройте путь до местоположения директории cygwin\bin, так что bash и другие инструменты будут доступны:
set PATH=%PATH%;c:\cygwin\bin
Так вы можете запускать команды cygwin из командной строки MSVC
Перейдите в исходный каталог icu-пакета и исправьте кодировки строк, иначе bash не будет работать:
dos2unix * dos2unix -f configure
Для сборки release запустите:
bash runConfigureICU ^ Cygwin/MSVC ^ --prefix=/cygdrive/c/cppcms_deps/x64/Release make make install make distclean
Distclean позволит гладко запускать debug конфигурацию. Обратите внимание на cygwin-стиль пути к месту установки:
/cygdrive/c/cppcms_deps/x64/Release
Для сборки debug запустите
bash runConfigureICU ^ --enable-debug --disable-release ^ Cygwin/MSVC ^ --prefix=/cygdrive/c/cppcms_deps/x64/Debug make make install make distclean
Примечание:
--enable-debug --disable-release
должны идти доCygwin/MSVC
- иначе вы получите бинарники release- Обратите внимание, скрипт установки устанавливает DLL-файлы в то же место, что и lib, поэтому вам нужно переместить их из
c:\cppcms_deps\x64\(Release|Debug)\lib
вc:\cppcms_deps\x64\(Release|Debug)\bin
Теперь у вас есть рабочее ICU.
Сборка CppCMS
Несколько заметок при сборке с использованием MSVC:
- Поддерживается только генератор "NMake Makefiles"
- Вы должны явно указать
-DCMAKE_BUILD_TYPE=Debug
или-DCMAKE_BUILD_TYPE=RelWithDebInfo
, т.к. по умолчанию в MSVC - Debug. - Также рекомендуется добавить
-DDISABLE_STATIC=ON
, поскольку на Windows только dll версия позволяет создавать динамически загружаемые view и использовать плагины.
Итак, откройте консоль VS, перейдите в каталог исходников cppcms и запустите конфигурацию и сборку:
Release
Сборка Release
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 ^ .. nmake
Тестирование:
set PATH=%PATH%;c:\cppcms_deps\x64\Release\bin;.\booster\ nmake test
Установка:
nmake install
Debug
Сборка Debug
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 ^ .. nmake
Тестирование:
set PATH=%PATH%;c:\cppcms_deps\x64\Debug\bin;.\booster\ nmake test
Установка:
nmake install
И теперь приступим к разработке с использованием CppCMS