Сборка программы, использующей OpenSSL, для разных линуксов

199
19 декабря 2017, 18:33

Есть кроссплатформенная программа заказчика под Window/OsX/Linux - C++/Qt/Qml. С линуксами возникает проблема линковки Qt с openssl. Если компилирую программу на LinuxMint, то на Debian при запуске программа ругается на несовместимую версию openssl. На Ubuntu проблем не возникает. При этом, напрямую openssl в программе не используется. Если не ошибаюсь, только QNetworkAccessManager. То есть, openssl используется опосредственно через Qt либы.

Какие есть варианты решения этой проблемы? Есть ли возможность собирать один бинарник для Mint, Ubuntu и Debian?

По-умолчанию Qt динамически загружает openssl либы из системы. Но при сборке самой Qt используется конкретная либа openssl, которая может быть несовместима с openssl на целевой системе. Debian использует более свежие либы, чем Mint и Ubuntu. Как это разрулить - не понятно.

Answer 1

Если программа устанавливается в отдельную папку (как многие делают в /opt/) есть такой вариант.

1 LD_LIBRARY_PATH

Скопируй нужную версию libcrypto и libssl в папку с программой и сделай симлинки на libcrypto.so.1.1, libssl.so.1.1 и на libcrypto.so.1.0.0 .

Это поломает системный линковщик и все запустится хорошо.

Есть ещё моменты с glibc. Для запуска на старых дистрах понадобится сборка под manylinux.

2 LD_PRELOAD

Более аккуратный способ, который используют многие проприетарщики.

Также скидываем нужные библиотеки в папку с приложением и делаем обертку для запуска.

#!/bin/bash
LD_PRELOAD=./libcrypto.so ./my-programm
3 И если проект не большой, то линкуйте статический файл.
Answer 2

Сделать свой набор библиотек с которыми вы будете деплоить приложение. Это не единственные грабли на которые вы наступите пытаясь пользоватся системными библиотеками.

READ ALSO
Qt поэлементный скролл

Qt поэлементный скролл

Вопрос такой, есть QScrollArea с некоторым количеством кнопок на нейДля области установлен скролл через QScroller::grabGesture(viewport(), QScroller::TouchGesture); Как сделать,...

161
Плавное увеличение частоты выполнения

Плавное увеличение частоты выполнения

Пишу код на ардуино, раз в 1 мс подаю ток на нужный мне пин пусть это делает функция pin()

219
Вывод/передача String на экране Android

Вывод/передача String на экране Android

Добрый деньЯ начинаю осваивать Android Api и хочу вывести строку на экране телефона через консоль ПК, связанные через USB

219
Picasso в Android Java

Picasso в Android Java

Всем саламВ приложения для загрузки и вывода изображений использую picasso

219