armhf

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. Если нужно "просто скомпилировать пару раз" и не важна скорость сборки — Способ 1 (Docker + QEMU).
  2. Если компилировать нужно постоянно — Способ 2 (сборка своего образа на базе Dockcross).


Report Page