Подтвердить что ты не робот

Есть ли способ построить статический Qt со статическим OpenSSL?

Оригинальный вопрос был несколько иным, но частью более серьезного вопроса.

Я пытаюсь создать Qt 5.2 как статический со статическим OpenSSL в Windows.

Моя конечная цель - отправить одиночный двоичный без необходимости предоставления libeay32.dll и ssleay32.dll с ним. Однако мне кажется, что это невозможно. Я построил статический Qt со статическими opensl libs, но похоже, что Qt полностью игнорирует предоставленные библиотеки и всегда ищет DLL.

Этот ответ также предполагает, что QtNetwork всегда ищет DLL и игнорирует все остальное, но также заявляет, что "два варианта должны собирать OpenSSL в Qt...", но это, похоже, не так.

Может кто-нибудь дать окончательный ответ?

Это моя конфигурация Qt (разрывы строк добавлены для чтения):

configure -static -qmake -opensource -nomake examples -opengl desktop
-platform win32-msvc2010 -openssl -I C:\git\openssl\build\include
-L C:\git\openssl\build\lib OPENSSL_LIBS="-llibeay32 -lssleay32 -lgdi32"
4b9b3361

Ответ 1

Есть ли способ создать статический Qt со статическим OpenSSL?

Конечно, вам нужно использовать следующий параметр при настройке Qt:

-openssl-linked

Причина в том, что QtNetwork по умолчанию использует класс QLibrary для динамического открытия библиотеки для получения необходимых символов.

Это возможность сказать Qt не делать этого и соблюдать нормальные правила привязки.

При этом не рекомендуется использовать статическую привязку для openssl, если обновления безопасности должны быть доступны для конечного пользователя без вашего участия. Подумайте, что на мгновение, что произойдет, если вы ушли, больше не работая над этим проектом и т.д.

Кроме того, эта настройка часто не тестируется, поэтому вы можете столкнуться с некоторыми проблемами, которые должны быть исправлены выше по течению, но это решение для рассматриваемого варианта использования.

Отказ от ответственности: поскольку SO о программировании, я игнорирую последствия лицензирования для статической ссылки againt Qt, поэтому я хотел бы просто напомнить, что вы должны знать о правильном использовании, чтобы не попасть в юридические проблемы.

Ответ 2

OPENSSL_LIBS = "- llibeay32 -lssleay32"...

Избегайте -l вообще (и -l и -Wl,-Bstatic). Компилятор иногда игнорирует запрос на статическую привязку (Apple), и иногда script изменяет его (я не могу сказать, сколько скриптов пользовательской сборки укусил меня).

Вместо этого используйте полностью указанный архив, как если бы вы использовали объектный файл. В LDLIBS добавьте следующее, чтобы не было шанса для script зачеркнуть что-либо или линкера, чтобы игнорировать ваш запрос:

/usr/local/ssl/lib/libssl.a /usr/local/ssl/lib/libcrypto.a

Очевидно, что вы должны изменить путь libssl.a и libcrypto.a в соответствии с вашей установкой.

Если у вас нет LDLIBS, добавьте его в LDFLAGS (или "другие метки компоновщика" в среде IDE).

В Qt это выглядит как QMAKE_LFLAGS или LIBS. Или вы могли бы попробовать следующее сообщение: Как добавить "Дополнительные зависимости" (настройки компоновщика).

Тот же трюк применяется и к общим объектам (но линкеры предпочитают общие объекты, поэтому он обычно не становится проблемой). То есть вы можете указать:

/usr/local/ssl/lib/libssl.so /usr/local/ssl/lib/libcrypto.so

То, что следует помнить при указании общего объекта, как указано выше, заключается в том, что вы должны указать rpath, чтобы обеспечить, чтобы компоновщик времени выполнения получал сообщение. То есть, вы должны добавить следующее в LDFLAGS или "другие параметры компоновщика":

-Wl,-rpath=/usr/local/ssl/lib

Меня несколько укусили при указании общих объектов при использовании библиотеки OpenSSL FIPS Capable Library, которая находится в /usr/local/ssl/lib, потому что компоновщик времени выполнения использует дистрибутив OpenSSL в /usr/lib или /usr/lib64. Библиотека OpenSSL FIPS Capable Library - это те, которые вы вызываете FIPS_mode_set on.

Вы также можете удалить (или переименовать) общий объект из этого места, оставив только статический архив. Мне пришлось использовать эту технику в прошлом при создании под Xcode для iPhone. Xcode отказался использовать статический архив даже с правильно размещенным -Bstatic. (Кросс-компиляторы и модифицированные инструментальные цепочки являются одними из худших для использования в разы). Я не думаю, что вам придется изменять каталоги установки, поэтому я обычно не использую эту технику.

Подводя итог, не оставляйте ничего случайным и избегайте -l, -l и -Wl,-Bstatic. Полностью укажите, что вы хотите, и используйте полное имя пути к библиотеке, и используйте их как объектные файлы. Используйте rpath, если вы указываете общий объект.

Ответ 3

Вот как я строю Qt 5.7.1 с поддержкой SSL в Windows с помощью MSVC 2013:

Убедитесь, что Perl, Python и Ruby можно найти в переменной среды PATH.

Загрузите Qt из репозитория github:

cd C:\Qt
git clone https://github.com/qt/qt5.git
cd C:\Qt\qt5 
git checkout 5.7 

Обязательно зарегистрируйте фиксацию 36e7cff94fbb4af5d8de6739e66164c6e6873586. В это время проверка 5.7 делает именно это.

Поместите содержимое ниже в qt5vars.bat, расположенном в C:\Qt\qt5. Внесите коррективы, если вам нужно:

@echo off

REM Set up \Microsoft Visual Studio 2015, where <arch> is \c amd64, \c x86, etc.
CALL "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x86

REM Edit this location to point to the source code of Qt
SET _ROOT=C:\Qt\qt5

SET PATH=%_ROOT%\qtbase\bin;%_ROOT%\gnuwin32\bin;%PATH%

REM Uncomment the below line when using a git checkout of the source repository
SET PATH=%_ROOT%\qtrepotools\bin;%PATH%

REM Uncomment the below line when building with OpenSSL enabled. If so, make sure the directory points
REM to the correct location (binaries for OpenSSL).
SET PATH=C:\OpenSSL-Win32\bin;%PATH%

REM When compiling with ICU, uncomment the lines below and change <icupath> appropriately:
REM SET INCLUDE=<icupath>\include;%INCLUDE%
REM SET LIB=<icupath>\lib;%LIB%
REM SET PATH=<icupath>\lib;%PATH%

REM Contrary to earlier recommendations, do NOT set QMAKESPEC.

SET _ROOT=

REM Keeps the command line open when this script is run.
cmd /k

После этого выполните этот файл и правильно запустите репозиторий:

qt5vars.bat 
perl init-repository

Наконец, чтобы успешно сконфигурировать и скомпилировать библиотеку (с версиями отладки и выпуска), убедитесь, что пути, на которые ссылается configure, также действительны в вашей системе:

configure -static -static-runtime -debug-and-release -ssl -openssl -openssl-linked -opengl dynamic -platform win32-msvc2013 -prefix C:\Qt\qt5.7-msvc2013-static -nomake tests -nomake examples -I "C:\OpenSSL-Win32\include" -L "C:\OpenSSL-Win32\lib\VC\static" OPENSSL_LIBS="-lUser32 -lAdvapi32 -lGdi32 -lCrypt32" OPENSSL_LIBS_DEBUG="-lssleay32MTd -llibeay32MTd" OPENSSL_LIBS_RELEASE="-lssleay32MT -llibeay32MT"
nmake
nmake install

Все до сих пор должно было проходить гладко и красиво. Теперь нужно настроить Qt Creator на обнаружение этой новой версии Qt версии и создать новый набор для ваших проектов:

1H91c.pnge8piC.png