Лучший способ кросс-компиляции QUIC для curl
Полное руководство по кросс-компиляции curl с поддержкой QUIC и HTTP/3 для Windows. Узнайте о стабильной конфигурации quictls, правильном порядке сборки и решении проблем.
Какой самый стабильный и лучший вариант собрать QUIC для curl [кросс-компиляция]?
Пробую собрать с максимальными “плюшками”:
export T=x86_64-w64-mingw32
export GSASL_DIR=/root/curl-build/winlibs/gsasl-mingw
NGHTTP3_DIR=/root/curl-build/winlibs/nghttp3-1.12.0-mingw
export CPPFLAGS="-I${NGHTTP3_DIR}/include -I${GSASL_DIR}/include"
export LDFLAGS="-L${NGHTTP3_DIR}/lib -L${GSASL_DIR}/lib -lgsasl"
export LIBS="-lgsasl"
export PKG_CONFIG_PATH="/root/curl-build/winlibs/libpsl-mingw/lib/pkgconfig:\/root/curl-build/winlibs/libidn2-mingw/lib/pkgconfig:\/root/curl-build/winlibs/nghttp3-1.12.0-mingw/lib/pkgconfig:\/root/curl-build/winlibs/libunistring-mingw/lib/pkgconfig:\/root/curl-build/winlibs/libiconv-mingw/lib/pkgconfig:\/root/curl-build/winlibs/openssl-quictls-mingw/lib64/pkgconfig:\/root/curl-build/winlibs/zlib-mingw/lib/pkgconfig:\/root/curl-build/winlibs/ngtcp2-mingw/lib/pkgconfig:\/root/curl-build/winlibs/brotli-mingw/lib/pkgconfig:\/root/curl-build/winlibs/zstd-mingw/lib/pkgconfig:\/root/curl-build/winlibs/nghttp2-mingw/lib/pkgconfig:\/root/curl-build/winlibs/libgsasl-mingw/lib/pkgconfig:\/root/curl-build/winlibs/libssh2-mingw/lib/pkgconfig"
CC=$T-gcc AR=$T-ar RANLIB=$T-ranlib STRIP=$T-strip \
../curl-8.16.0/configure --host=$T --build=$(uname -m)-pc-linux-gnu \
--prefix=/root/curl-build/winlibs/curl-mingw-latest \
--with-libgsasl=/root/curl-build/winlibs/gsasl-mingw \
--with-zlib=/root/curl-build/winlibs/zlib-mingw \
--cache-file=config.cache \
--with-openssl=/root/curl-build/winlibs/openssl-quictls-mingw \
--with-ca-bundle="cacert.crt" \
--with-ca-fallback \
--with-ca-embed="/root/curl-8.16.0/curl-ca-bundle.crt" \
--with-nghttp3=/root/curl-build/winlibs/nghttp3-1.12.0-mingw \
--with-nghttp2=/root/curl-build/winlibs/nghttp2-mingw \
--with-ngtcp2=/root/curl-build/winlibs/ngtcp2-mingw \
--with-brotli=/root/curl-build/winlibs/brotli-mingw \
--with-zstd=/root/curl-build/winlibs/zstd-mingw \
--with-libidn2=/root/curl-build/winlibs/libidn2-mingw \
--with-libpsl=/root/curl-build/winlibs/libpsl-mingw \
--with-libssh2=/root/curl-build/winlibs/libssh2-mingw \
--with-openssl-quic=/root/curl-build/winlibs/openssl-quictls-mingw \
--enable-http3 \
--enable-alt-svc \
--enable-headers-api \
--enable-hsts \
--enable-websockets \
--enable-ipv6 \
--enable-threaded-resolver \
--enable-httpsrr \
--enable-sspi \
--enable-ssls-export \
--enable-shared
Пробовал BoringSSL, с горем пополам получилось, но при конфигурации ngtcp2 его не видит, пишет libngtcp2_crypto_boringssl: no, с quictls (который последняя версия 3.4.0) вообще не получилось скомпилить.
Вот интересует какой вариант, чтобы все всё видели и нормально скомпилить это всё.
В целом я уже собрал, но хочется, чтобы всё было последних версий.
# curl --version
curl 8.16.0 (x86_64-w64-mingw32) libcurl/8.16.0 quictls/3.1.7 zlib/1.3.1 brotli/1.1.0 zstd/1.5.7 libidn2/2.3.6 libpsl/0.21.5 libssh2/1.11.1 nghttp2/1.64.0 ngtcp2/1.11.0 nghttp3/1.12.0 libgsasl/2.2.2
Release-Date: 2025-09-10
Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns ldap ldaps mqtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp ws wss
Features: alt-svc AsynchDNS brotli gsasl HSTS HTTP2 HTTP3 HTTPS-proxy HTTPSRR IDN IPv6 Kerberos Largefile libz NTLM PSL SPNEGO SSL SSLS-EXPORT SSPI threadsafe TLS-SRP UnixSockets zstd
Наиболее стабильным и лучшим вариантом для кросс-компиляции QUIC для curl в Windows является использование quictls с правильным порядком сборки и совместимыми версиями. Основная проблема в вашем подходе - неверная последовательность сборки и версия quictls.
curl 8.16.0 (x86_64-w64-mingw32) libcurl/8.16.0 quictls/3.1.7 zlib/1.3.1 brotli/1.1.0 zstd/1.5.7 libidn2/2.3.6 libpsl/0.21.5 libssh2/1.11.1 nghttp2/1.64.0 ngtcp2/1.11.0 nghttp3/1.12.0 libgsasl/2.2.2
Содержание
- Основные компоненты QUIC сборки
- Проблемы с текущей конфигурацией
- Оптимальная последовательность сборки
- Настройка переменных окружения
- Правильные флаги configure
- Альтернативные варианты TLS библиотек
- Верификация сборки
Основные компоненты QUIC сборки
Для сборки curl с поддержкой QUIC и HTTP/3 требуется три основных компонента источник:
- ngtcp2 - библиотека QUIC transport implementation
- nghttp3 - библиотека HTTP/3 protocol implementation
- QUIC-capable TLS library - библиотека с поддержкой QUIC API
Важное замечание: базовый OpenSSL не предоставляет необходимые API для QUIC клиента источник.
Проблемы с текущей конфигурацией
Основные проблемы в вашем подходе:
-
Версионная несовместимость: OpenSSL v3.5.0+ требуется для интеграции с ngtcp2 v1.12.0+ источник
-
Дублирование конфигурации: Указаны оба варианта
--with-opensslи--with-openssl-quic, что может вызывать конфликты -
Неверный порядок сборки: Сборка должна происходить в строгом порядке: TLS библиотека → ngtcp2 → nghttp3 → curl
-
Отсутствие статической линковки: Для кросс-компиляции в Windows рекомендуется статическая линковка зависимостей
Оптимальная последовательность сборки
1. Сборка quictls (рекомендуемый вариант)
# Клонируем quictls (OpenSSL fork с поддержкой QUIC API)
git clone --depth=1 -b openssl-3.4.0 https://github.com/quictls/openssl
cd openssl
# Конфигурация для Windows cross-compilation
./Configure --prefix=/path/to/quictls-mingw \
--cross-compile-prefix=x86_64-w64-mingw32- \
--openssldir=/path/to/quictls-mingw \
no-shared \
enable-tls1_3 \
enable-quic
make -j$(nproc)
make install_sw
2. Сборка ngtcp2
git clone --depth=1 -b v1.12.0 https://github.com/ngtcp2/ngtcp2
cd ngtcp2
# Установка зависимостей
autoreconf -fi
./configure --prefix=/path/to/ngtcp2-mingw \
--host=x86_64-w64-mingw32 \
--enable-lib-only \
--with-openssl=/path/to/quictls-mingw \
--disable-shared
make -j$(nproc)
make install
3. Сборка nghttp3
git clone --depth=1 -v1.12.0 https://github.com/ngtcp2/nghttp3
cd nghttp3
autoreconf -fi
./configure --prefix=/path/to/nghttp3-mingw \
--host=x86_64-w64-mingw32 \
--enable-lib-only \
--with-ngtcp2=/path/to/ngtcp2-mingw \
--disable-shared
make -j$(nproc)
make install
Настройка переменных окружения
export T=x86_64-w64-mingw32
export PREFIX=/path/to/install
# Пути к библиотекам
export QUICTLS_DIR=/path/to/quictls-mingw
export NGTCP2_DIR=/path/to/ngtcp2-mingw
export NGHTTP3_DIR=/path/to/nghttp3-mingw
export ZLIB_DIR=/path/to/zlib-mingw
export BROTLI_DIR=/path/to/brotli-mingw
export ZSTD_DIR=/path/to/zstd-mingw
# Флаги компиляции
export CPPFLAGS="-I${QUICTLS_DIR}/include \
-I${NGTCP2_DIR}/include \
-I${NGHTTP3_DIR}/include \
-I${ZLIB_DIR}/include \
-I${BROTLI_DIR}/include \
-I${ZSTD_DIR}/include"
export LDFLAGS="-L${QUICTLS_DIR}/lib \
-L${NGTCP2_DIR}/lib \
-L${NGHTTP3_DIR}/lib \
-L${ZLIB_DIR}/lib \
-L${BROTLI_DIR}/lib \
-L${ZSTD_DIR}/lib"
# Отключаем pkg-config для избежания конфликтов
export PKG_CONFIG_PATH=""
Правильные флаги configure
CC=$T-gcc AR=$T-ar RANLIB=$T-ranlib STRIP=$T-strip \
../curl-8.16.0/configure --host=$T --build=$(uname -m)-pc-linux-gnu \
--prefix=${PREFIX}/curl-mingw \
--with-openssl=${QUICTLS_DIR} \
--with-nghttp3=${NGHTTP3_DIR} \
--with-ngtcp2=${NGTCP2_DIR} \
--with-zlib=${ZLIB_DIR} \
--with-brotli=${BROTLI_DIR} \
--with-zstd=${ZSTD_DIR} \
--disable-shared \
--enable-static \
--enable-http3 \
--enable-alt-svc \
--enable-websockets \
--enable-ipv6 \
--enable-threaded-resolver \
--enable-sspi \
--enable-crypto-auth \
--enable-tls-srp \
--enable-ares \
--enable-manual \
--disable-ldap \
--disable-ldaps \
--disable-rtsp \
--disable-dict \
--disable-telnet \
--disable-tftp \
--disable-pop3 \
--disable-imap \
--disable-smb \
--disable-smtp \
--disable-gopher \
--disable-file
Важно! Убедитесь, что все библиотеки собраны с флагом
--disable-sharedдля статической линковки. Это предотвратит проблемы с зависимостями в Windows.
Альтернативные варианты TLS библиотек
BoringSSL
Если предпочитаете BoringSSL, используйте следующую последовательность:
# Сборка BoringSSL
git clone https://boringssl.googlesource.com/boringssl
cd boringssl
mkdir build && cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw64.cmake \
-DCMAKE_INSTALL_PREFIX=/path/to/boringssl-mingw ..
make -j$(nproc)
make install
# Сборка ngtcp2 с BoringSSL
./configure --with-boringssl=/path/to/boringssl-mingw
wolfSSL
# Сборка wolfSSL для Windows
git clone https://github.com/wolfSSL/wolfssl
cd wolfssl
autoreconf -fi
./configure --host=x86_64-w64-mingw32 \
--prefix=/path/to/wolfssl-mingw \
--enable-quic \
--enable-all \
--disable-shared
make -j$(nproc)
make install
Примечание: wolfSSL предоставляет хорошую альтернативу, но требует дополнительных настроек для некоторых функций QUIC источник.
Верификация сборки
После сборки проверьте результат:
curl --version
Должны видеть поддержку HTTP/3:
Protocols: ... HTTP3 ...
Features: ... HTTP3 ...
Проверьте поддержку QUIC:
curl --http3 https://quic.nginx.org/
Если все работает, вы должны увидеть успешное подключение по HTTP/3.
Рекомендация: Используйте quictls с версией 3.4.0+ и ngtcp2 1.12.0+ для максимальной стабильности и совместимости. Этот подход обеспечивает лучшую поддержку QUIC API и минимизирует проблемы с кросс-компиляцией для Windows.
Источники
- HTTP/3 with curl - Official Documentation
- Statically linking ngtcp2 and quictls/openssl on Windows - GitHub Issue
- HTTP3 (and QUIC) - Fuchsia Source
- CMake: add HTTP/3 support - curl Commit
- QUIC and HTTP/3 with wolfSSL - Daniel Stenberg’s Blog
Заключение
Ключевые моменты для успешной кросс-компиляции QUIC:
- Используйте quictls вместо стандартного OpenSSL для лучшей QUIC поддержки
- Следите за версиями: quictls 3.4.0+ и ngtcp2 1.12.0+ обеспечивают совместимость
- Статическая линковка предпочтительнее для Windows приложений
- Правильный порядок сборки: TLS → ngtcp2 → nghttp3 → curl
- Отключайте ненужные протоколы для уменьшения размера бинарника
Действия для улучшения текущей сборки:
- Обновите quictls до версии 3.4.0 или выше
- Убедитесь, что ngtcp2 собран с правильным путем к quictls
- Используйте статическую линковку всех зависимостей
- Удалите дублирующие параметры конфигурации
Альтернативные варианты:
- Если quictls вызывает проблемы, попробуйте BoringSSL с правильными путями
- wolfSSL предлагает хорошую альтернативу, но требует больше ручной настройки
Эта конфигурация обеспечит стабильную и современную сборку curl с полной поддержкой QUIC и HTTP/3 для Windows.