Как-то раз мне потребовалось использовать известную библиотеку OpenCV в своём Qt приложении. Скачав OpenCV из репозитория через apt-get я столкнулся с проблемой, что она никак не хотела прилинковываться к моему приложению, выдавая ошибку при компиляции. Погуглив ошибку выяснилось, что OpenCV либы в репозитории были собраны свежей версией компилятора gcc с какими-то хитрыми инструкциями из-за чего возникали проблемы. Что ж, придётся кросс-компилировать OpenCV из исходников на ноуте старой версией gcc (можно скомпилить на RasPi, но это долго (тут пишут, что процесс занимает 10-12 часов), поэтому воспользуемся кросс-компиляцией для ARM процессора на более мощном компьютере. Ниже я подробно опишу, как это сделать.
Подготовка
Скачиваем инструментарий с кросс-компиляторомgit clone https://github.com/raspberrypi/tools.git
В папкеarm-bcm2708 вы найдёте различные виды кросс-компиляторов. Я использую gcc-linaro-arm-linux-gnueabihf-raspbian-x64 (поскольку у меня на ноуте 64-битный процессор)
Добавляем кросс-компилятор в переменную $PATH. Для этого в конец файла .bashrc добавляем строчку PATH=$PATH:/opt/arm/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
Вставляем microSD карту из Raspberry Pi в ноутбук или usb-кардридер и копируем папки lib и usr в /opt/arm/RaspberryPi/sysroot
Настраиваем исходники OpenCV
Будем использовать конфигурацию платформенной сборки, поэтому копируем файлopencv/platforms/linux/arm-gnueabi.toolchain.cmake в pi.cmake, который мы будем далее редактировать. Редактируем pi.cmake следующим образом:
Находим строки
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mthumb -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mthumb -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi")
и меняем на
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi -march=armv6 -mfloat-abi=hard -mfpu=vfp")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdata-sections -Wa,--noexecstack -fsigned-char -Wno-psabi -march=armv6 -mfloat-abi=hard -mfpu=vfp")
Также нужно удалить строки
set(FLOAT_ABI_SUFFIX "")
if (NOT SOFTFP)
set(FLOAT_ABI_SUFFIX "hf")
endif()
и вставить set(FLOAT_ABI_SUFFIX "hf")
Из этих строк вырезаем версию компилятора
find_program(CMAKE_C_COMPILER NAMES arm-linux-gnueabi${FLOAT_ABI_SUFFIX}-gcc-${GCC_COMPILER_VERSION})
find_program(CMAKE_CXX_COMPILER NAMES arm-linux-gnueabi${FLOAT_ABI_SUFFIX}-g++-${GCC_COMPILER_VERSION})
Чтобы получилось так
find_program(CMAKE_C_COMPILER NAMES arm-linux-gnueabi${FLOAT_ABI_SUFFIX}-gcc)
find_program(CMAKE_CXX_COMPILER NAMES arm-linux-gnueabi${FLOAT_ABI_SUFFIX}-g++)
Прописываем путь до sysroot
set(ARM_LINUX_SYSROOT /opt/arm/RaspberryPi/sysroot CACHE PATH "ARM cross compilation system root")
Если при сборке cmake не сможет найти архиватор, то добавьте ещё такие строки
set(CMAKE_AR /opt/arm/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf-ar CACHE FILEPATH "Archiver")
Компиляция
Создаём папку для сборки и заходим в неё
mkdir build
cd build
Запускаем cmake
cmake \
-D CMAKE_TOOLCHAIN_FILE=../platforms/linux/pi.cmake \
-D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/opt/arm/RaspberryPi/sysroot \
-D INSTALL_C_EXAMPLES=OFF \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D BUILD_EXAMPLES=OFF ..
Собираем - make -j4 , параметр j определяет сколько ядер процессора задействовать при сборке. У меня их 4
Устанавливаем sudo make install после этого в sysroot скопируются скомпиленные либы OpenCV
На этом всё, удачной компиляции!
Комментариев: 0