armhf
DOCKER BULKERПроблема, с которой вы столкнулись («Ад зависимостей» или Dependency Hell), типична для попыток установить *-dev:armhf пакеты на 64-битную Ubuntu. Пакетный менеджер apt требует, чтобы версии библиотек для amd64 (ваша система) и armhf совпадали бит-в-бит, но в репозиториях Ubuntu они часто рассинхронизированы (основной репозиторий против ports).
Самый простой и беспроблемный способ в 2024 году — перестать мучить основную систему и изолировать среду сборки.
Вот два лучших решения, от простого к быстрому.
Способ 1: Docker + QEMU (Самый простой)
Этот метод позволяет запустить виртуальный контейнер с архитектурой armv7. Внутри него вы просто пишете apt install libssl-dev (без всяких суффиксов) и компилируете обычным g++. Это работает медленнее (из-за эмуляции), но гарантированно избавляет от проблем с путями и кросс-компиляторами.
1. Установите Docker и эмулятор QEMU:
Bash sudo apt update sudo apt install docker.io qemu-user-static sudo usermod -aG docker $USER # (после этого нужно перелогиниться в систему, чтобы права docker применились)
2. Запустите контейнер Ubuntu armv7:
Мы монтируем вашу текущую папку с кодом в папку /work внутри контейнера.
Bash docker run --rm -it --platform linux/arm/v7 -v $(pwd):/work -w /work ubuntu:24.04
3. Внутри контейнера (вы увидите приглашение командной строки):
Теперь вы находитесь "внутри" ARM-системы.
Bash apt update apt install build-essential libssl-dev # Компилируем как обычно! g++ main.cpp -o myapp -lssl -lcrypto
Ваш бинарный файл myapp появится в текущей папке и на вашем основном компьютере.
Способ 2: Dockcross (Быстрый и Профессиональный)
Если проект большой и эмуляция (Способ 1) работает слишком медленно, используйте dockcross. Это готовый Docker-образ, где уже настроен кросс-компилятор и среда.
1. Подготовка скрипта:
Bash # Скачиваем образ и генерируем скрипт-обертку docker run --rm dockcross/linux-armv7 > ./dockcross-armv7 chmod +x ./dockcross-armv7
2. Установка библиотек (один раз):
Поскольку вам нужен OpenSSL, его нужно добавить в этот образ. Мы запустим образ и доустановим библиотеку внутрь него (изменения не сохранятся после выхода, поэтому для постоянной работы лучше сделать свой Dockerfile, но для разовой сборки пойдет так).
Лучший вариант — создать свой Dockerfile на базе dockcross:
Создайте файл Dockerfile:
Dockerfile FROM dockcross/linux-armv7 ENV DEFAULT_DOCKCROSS_IMAGE my-armv7-builder # Устанавливаем OpenSSL для armhf внутри контейнера RUN apt-get update && apt-get install -y libssl-dev
Соберите его:
Bash docker build -t my-armv7-builder .
Генерируем скрипт запуска для вашего нового образа:
Bash docker run --rm my-armv7-builder > ./dockcross chmod +x ./dockcross
3. Компиляция:
Теперь просто используйте скрипт ./dockcross перед вашими командами. Он пробросит текущую директорию внутрь.
Bash ./dockcross bash -c '$CC main.cpp -o main -lssl -lcrypto' # Или если у вас CMake: ./dockcross cmake -Bbuild . ./dockcross make -Cbuild
Почему не стоит чинить apt install ...:armhf?
Попытка заставить работать sudo apt install libssl-dev:armhf на Ubuntu 24.04 требует удаления libssl-dev:amd64 (так как файлы заголовков конфликтуют), что может потянуть за собой удаление половины вашего софта (включая рабочее окружение).
Итог:
- Если нужно "просто скомпилировать пару раз" и не важна скорость сборки — Способ 1 (Docker + QEMU).
- Если компилировать нужно постоянно — Способ 2 (сборка своего образа на базе Dockcross).