HowTo: создание двоичного SDK(набора библиотек) для Windows с использованием vcpkg
В этом HowTo мы рассмотрим подготовку пакетов vcpkg
для использования в двоичном виде.
В качестве «подопытных кроликов» будут выступать Qt6
, QCustomPlot
и я.
Spoiler: с QCustomPlot
придется немного пострадать, но обычно все проще.
TLDR: vcpkg export
Предварительные требования
Для создания набора библиотек потребуются установленные:
-
Visual Studio с установленным набором для разработки на C++
Вся работа будет происходить в Git Bash
(можно и в другом терминале: cmd
, powershell
, etc)
CMake и Git для удобства лучше установить в директории с короткими именами и добавить в PATH
В примерах для этого будут использованы директории /d/tools/{cmake,git,vcpkg}
Открываем терминал и переходим в базовую директорию
cd /d/tools
Установка vcpkg
Установка состоит в клонировании репозитория с «рецептами» пакетов
git clone https://github.com/microsoft/vcpkg.git cd vcpkg
Посмотрим список релизных версий
git show-ref 21816e0df975ab3ba13ab75263c4deeb080ef681 refs/heads/master 21816e0df975ab3ba13ab75263c4deeb080ef681 refs/remotes/origin/HEAD 21816e0df975ab3ba13ab75263c4deeb080ef681 refs/remotes/origin/master e2049cb9754006b6a2abed781d34030e16702fad refs/tags/2019.06 455223d009fc6fef0d9293e511d64e9e372abdb0 refs/tags/2019.07 ... b322364f06308bdd24823f9d8f03fe0cc86fd46f refs/tags/2024.12.16 6f29f12e82a8293156836ad81cc9bf5af41fe836 refs/tags/2025.01.13 d5ec528843d29e3a52d745a64b469f810b2cedbf refs/tags/2025.02.14 b02e341c927f16d991edbd915d8ea43eac52096c refs/tags/2025.03.19
Указанные в нем хеши коммитов потребуются для использования версионирования.
Сейчас это не рассматриваем и переключаемся на последний релиз:
git checkout 2025.03.19 Note: switching to '2025.03.19'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by switching back to a branch. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -c with the switch command. Example: git switch -c Or undo this operation with: git switch - Turn off this advice by setting config variable advice.detachedHead to false HEAD is now at b02e341c92 [imgui] update to 1.91.9 (#44425)
Загрузим сам vcpkg
./bootstrap-vcpkg.bat -disableMetrics
Ключ -disableMetrics
отключает отправку телеметрии.
Если Вам нужно отравлять телеметрию в Microsoft — удалите из команды.
Настройка переменных окружения
Для сборки пакетов нужно указать «триплеты» для целевой и хостовой системы.
Иначе будут использованы настройки «по умолчанию».
Для Windows это сборка 32хбитных вариантов библиотек и утилит.
Будем собирать для и на Windows x64 поэтому установим x64-windows
export VCPKG_DEFAULT_TRIPLET=x64-windows export VCPKG_DEFAULT_HOST_TRIPLET=x64-windows export VCPKG_ROOT=d:/tools/vcpkg # необязательно
Для упрощения дальнейшей работы можно сохранить их в настройках системы.
Установка набора библиотек
Идем на https://vcpkg.io/en/packages и ищем названия пакетов
Для QCustomPlot
без неожиданностей — qcustomplot
Можно так же воспользоваться встроенным поиском:
./vcpkg search qcustomplot qcustomplot 2.1.1#1 QCustomPlot is a Qt C++ widget for plotting and data visualization. The result may be outdated. Run `git pull` to get the latest results. If your port is not listed, please open an issue at and/or consider making a pull request. - https://github.com/Microsoft/vcpkg/issues
Собственно установка:
./vcpkg install qcustomplot
vcpkg
скачает и скомпилирует все необходимые зависимости.
Это может занять прилично времени — можно сходить попить кофе.
У меня установка заняла полчаса.
Starting submission of qcustomplot:x64-windows@2.1.1#1 to 1 binary cache(s) in the background Elapsed time to handle qcustomplot:x64-windows: 30 s qcustomplot:x64-windows package ABI: 51d7df0801247592f000a45e1136824367618965ada4458385f5fd3a0a036152 Total install time: 29 min Completed submission of qtbase[brotli,concurrent,core,dbus,dnslookup,doubleconversion,freetype,gui,harfbuzz,icu,jpeg,network,opengl,openssl,pcre2,png,sql,sql-ps ql,sql-sqlite,testlib,thread,widgets,zstd]:x64-windows@6.8.2#1 to 1 binary cache(s) in 27 s Waiting for 2 remaining binary cache submissions... Completed submission of vcpkg-qmake:x64-windows@2023-03-22#3 to 1 binary cache(s) in 11 s (1/2) Completed submission of qcustomplot:x64-windows@2.1.1#1 to 1 binary cache(s) in 13 s (2/2) real 29m1.567s user 0m0.015s sys 0m0.000s
Сборка двоичного пакета
Тут есть несколько вариантов
-
создать директорию
-
упаковать в архив
-
создать пакеты для NuGet(удобно для VS. Наверно)
Просто скопируем все в директорию /d/tools/bin-pkgs
:
./vcpkg export --raw --output=../bin-pkgs --x-all-installed
Результат можно запаковать и использовать на другом ПК.
Использование двоичного пакета в CMake
Подобрались к тому, ради чего всё это было.
Создадим простой проект
mkdir ../pkg-test cd ../pkg-test touch main.cpp touch CMakeLists.txt
В любом текстовом редакторе набросаем код
///@file: main.cpp #include <QApplication> #include <qcustomplot.h> int main(int argc, char** argv) { QApplication app{argc, argv}; QCustomPlot plot; plot.show(); return app.exec(); }
# @file: CMakeLists.txt cmake_minimum_required(VERSION 3.20) project(pkg-test) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) find_package(Qt6 COMPONENTS Core Widgets REQUIRED) find_package(QCustomPlot REQUIRED) add_executable(pkg_test WIN32) target_sources(pkg_test PRIVATE main.cpp ) target_link_libraries(pkg_test PRIVATE Qt::Core Qt::Widgets qcustomplot )
Конфигурация
Для использования пакетов нужно установить переменную CMAKE_TOOLCHAIN_FILE
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=../bin-pkgs/scripts/buildsystems/vcpkg.cmake -- Selecting Windows SDK version 10.0.26100.0 to target Windows 10.0.19045. -- Performing Test CMAKE_HAVE_LIBC_PTHREAD -- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed -- Looking for pthread_create in pthreads -- Looking for pthread_create in pthreads - not found -- Looking for pthread_create in pthread -- Looking for pthread_create in pthread - not found -- Found Threads: TRUE -- Performing Test HAVE_STDATOMIC -- Performing Test HAVE_STDATOMIC - Success -- Found WrapAtomic: TRUE CMake Error at D:/tools/bin-pkgs/scripts/buildsystems/vcpkg.cmake:893 (_find_package): By not providing "FindQCustomPlot.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "QCustomPlot", but CMake did not find one. Could not find a package configuration file provided by "QCustomPlot" with any of the following names: QCustomPlotConfig.cmake qcustomplot-config.cmake Add the installation prefix of "QCustomPlot" to CMAKE_PREFIX_PATH or set "QCustomPlot_DIR" to a directory containing one of the above files. If "QCustomPlot" provides a separate development package or SDK, be sure it has been installed. Call Stack (most recent call first): CMakeLists.txt:15 (find_package) -- Configuring incomplete, errors occurred!
Хм. Ошибка — QCustomPlot
не найден.
Обычно всё проще.
К сожалению, не все пакеты предоставляют конфиги для CMake.
Поэтому приходится писать их самостоятельно.
Либо подставлять костыли. Что и сделаем.
Немного изменим файл проекта:
- find_package(QCustomPlot REQUIRED) + #find_package(QCustomPlot REQUIRED)
И переконфигурируем
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=../bin-pkgs/scripts/buildsystems/vcpkg.cmake -- Selecting Windows SDK version 10.0.26100.0 to target Windows 10.0.19045. -- Configuring done (0.2s) -- Generating done (0.3s) -- Build files have been written to: D:/tools/pkg-test/build
Успешно.
В директории build
создались скрипты для компиляции и проект для Visual Studio:
ls -l build/ total 324 -rw-r--r-- 1 maxim 197121 73424 Mar 25 17:00 ALL_BUILD.vcxproj -rw-r--r-- 1 maxim 197121 272 Mar 25 16:34 ALL_BUILD.vcxproj.filters -rw-r--r-- 1 maxim 197121 168 Mar 25 17:30 ALL_BUILD.vcxproj.user -rw-r--r-- 1 maxim 197121 54604 Mar 25 16:34 CMakeCache.txt drwxr-xr-x 1 maxim 197121 0 Mar 25 17:34 CMakeFiles/ drwxr-xr-x 1 maxim 197121 0 Mar 25 17:34 Debug/ -rw-r--r-- 1 maxim 197121 73544 Mar 25 17:00 ZERO_CHECK.vcxproj -rw-r--r-- 1 maxim 197121 515 Mar 25 16:34 ZERO_CHECK.vcxproj.filters -rw-r--r-- 1 maxim 197121 1729 Mar 25 16:34 cmake_install.cmake -rw-r--r-- 1 maxim 197121 3116 Mar 25 16:34 pkg-test.sln drwxr-xr-x 1 maxim 197121 0 Mar 25 16:37 pkg_test.dir/ -rw-r--r-- 1 maxim 197121 99062 Mar 25 17:20 pkg_test.vcxproj -rw-r--r-- 1 maxim 197121 1163 Mar 25 16:34 pkg_test.vcxproj.filters -rw-r--r-- 1 maxim 197121 168 Mar 25 17:30 pkg_test.vcxproj.user drwxr-xr-x 1 maxim 197121 0 Mar 25 16:37 pkg_test_autogen/ drwxr-xr-x 1 maxim 197121 0 Mar 25 16:37 x64/
Компиляция
Компиляция запускается стандартно для проекта для CMake:
cmake --build build Версия MSBuild 17.13.19+0d9f5a35a для .NET Framework 1>Checking Build System Automatic MOC and UIC for target pkg_test Building Custom Rule D:/tools/pkg-test/CMakeLists.txt mocs_compilation_Debug.cpp main.cpp Generating Code... D:\tools\pkg-test\main.cpp(4,10): error C1083: Cannot open include file: 'qcustomplot.h': No such file or directory [D:\tools\pkg-test\build\pkg_test.vcxproj]
И натыкаемся на очередную проблему с конфигурацией: путь к include
не прописан.
Что ж. Попробуем исправить.
Заголовочные файлы находятся по пути <pkg_dir>/installed/<triplet>/include
Нужно как то определить в какой директории находятся пакеты.
Для этого будем использовать переменную VCPKG_INSTALLED_DIR:
Добавим в проект путь до заголовочных файлов:
include_directories("${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include")
Конфигурируем/компилируем
cmake --build build Версия MSBuild 17.13.19+0d9f5a35a для .NET Framework Automatic MOC and UIC for target pkg_test mocs_compilation_Debug.cpp main.cpp Generating Code... LINK : fatal error LNK1104: cannot open file 'qcustomplot.lib' [D:\tools\pkg-test\build\pkg_test.vcxproj]
Да что ж такое.
Нужно будет завести issue на QCustomPlot
и по возможности pull request с патчем.
А пока захардкодим:
include_directories("${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib")
Конфигурируем/компилируем…
$ cmake --build build Версия MSBuild 17.13.19+0d9f5a35a для .NET Framework Automatic MOC and UIC for target pkg_test pkg_test.vcxproj ->; D:\tools\pkg-test\build\Debug\pkg_test.exe Building Custom Rule D:/tools/pkg-test/CMakeLists.txt
Успех.
Конечный вариант файла проекта:
# @file: CMakeLists.txt cmake_minimum_required(VERSION 3.20) project(pkg-test) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) # FIXME: dirty fix for QCustomPlot include_directories("${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include") link_directories("${VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib") find_package(Qt6 COMPONENTS Core Widgets REQUIRED) add_executable(pkg_test WIN32) target_sources(pkg_test PRIVATE main.cpp ) target_link_libraries(pkg_test PRIVATE Qt::Core Qt::Widgets qcustomplot2 )
Что осталось «за кадром»
Не решен вопрос о запуске/отладке.
Но это видимо проблема именно пакета QCustomPlot
— с другими возни меньше.
«Фото на память»

ссылка на оригинал статьи https://habr.com/ru/articles/894284/
Добавить комментарий