Проблема кросс-компиляции OpenCV для ARM9 Montavista Linux - PullRequest
2 голосов
/ 03 сентября 2010

Я пытаюсь кросс-компилировать библиотеку OpenCV для ее использования во встроенной системе под управлением Montavista Linux (в системе установлен процессор ARM926). Мне удалось настроить и сгенерировать make-файлы; источники собраны нормально, в том числе сторонние библиотеки. Проблема приходит во время ссылки. По какой-то причине libtool выбирает некоторые библиотеки из хост-системы (libjpeg, libtiff, libpng) и пытается связать их с объектными файлами ARM9 (что явно неверно). Я получаю ошибку

/ usr / lib / libpng12.so: не удалось прочитать символы: файл в неправильном формате .

Я не мог и до сих пор не могу понять, что именно не так с моей установкой (я даже пытался собрать библиотеку непосредственно в системе ARM9, но, к сожалению, у нее очень мало оперативной памяти и дросселей gcc). Я также изменил LD_LIBRARY_PATH envvar, чтобы он содержал системные библиотеки цели, и экспортировал его перед запуском configure и make. Вот что я передаю для настройки:

LDFLAGS="-L/opt/Montavista/pro/devkit/arm/v5t_le/target/usr/lib" CFLAGS="-I/opt
/Montavista/pro/devkit/arm/v5t_le/target/usr/include -fsigned-char -march=armv5te
-mtune=arm926ej-s -ffast-math -fomit-frame-pointer -funroll-loops" CC=/opt/Montavista
/pro/devkit/arm/v5t_le/bin/arm_v5t_le-gcc CXXFLAGS="-fsigned-char -march=armv5te 
-mtune=arm926ej-s -ffast-math -fomit-frame-pointer -funroll-loops" CXX=/opt/Montavista
/pro/devkit/arm/v5t_le/bin/arm_v5t_le-g++ ./configure --host=armv5tl-montavista-linux-
gnueabi --without-gtk --without-v4l --without-carbon --without-quicktime --without-
1394libs --without-ffmpeg --without-imageio --without-python --without-swig --enable-
static --enable-shared --disable-apps --prefix=/home/dev/Development/lib

Я нашел этот вопрос на SO, но, к сожалению, он не дает мне решения.

Я использую gcc версии 4.2.0 (MontaVista 4.2.0-16.0.32.0801914 2008-08-30) в Montavista Linux for ARM (плата Leopard с питанием от TI DM365), OpenCV 2.0.0. Моя хост-система - Ubuntu 10.4. Любые указания о том, как решить эту проблему, очень помогли бы.

Спасибо

[ОБНОВЛЕНИЕ] [ИСПРАВЛЕНО] : Метод создания make-файлов для OpenCV 2.0.0, основанный на автоинструментах, кажется, сломался при попытке кросс-компиляции (или по какой-то странной причине он не работал для меня ). Я использовал графический интерфейс CMake и указал правильный файл toolchain.cmake, и все прошло гладко. Смотрите ответ ниже.

Ответы [ 3 ]

2 голосов
/ 20 июля 2011

Процедура кросс-компиляции OpenCV 2.0 для ARM с использованием CMake GUI

Требования

  • Исходный архив OpenCV 2.0
  • CodeSourcery ARM кросс-компилятор v2009q1 или v2010.09 (оба протестированы)
  • Хост-машина Ubuntu 10.10 / 11.04
  • CMake> = v2.6 с CMake GUI

Шаги

  • Распакуйте где-нибудь на вашем хосте архив OpenCV; cd в это место и создайте каталог build
  • Откройте графический интерфейс CMake.Выберите:

    • Где находится исходный код: == путь к папке, в которую вы распаковали архив OpenCV
    • Гдедля сборки двоичных файлов: == путь к папке сборки, созданной на первом шаге
  • Добавить новую запись с именем COMPILER_ROOT в качестве записи пути и задайте в качестве значения путь кросс-компилятора, например, / opt / CodeSourcery / Sourcery_G ++ _ Lite / bin

  • Set CMAKE_TOOLCHAIN_FILE путь к файлу цепочки инструментов на вашем хост-компьютере;пример toolchain.cmake:

    # this one is important
    SET(CMAKE_SYSTEM_NAME Linux)
    #this one not so much
    SET(CMAKE_SYSTEM_VERSION 1)
    
    # specify the cross compiler
    set(COMPILER_ROOT /opt/CodeSourcery/Sourcery_G++_Lite/bin)
    set(CMAKE_C_COMPILER ${COMPILER_ROOT}/arm-none-linux-gnueabi-gcc)
    set(CMAKE_CXX_COMPILER ${COMPILER_ROOT}/arm-none-linux-gnueabi-g++)
    
    # specify how to set the CMake compilation flags
    # CPP
    SET(CMAKE_CXX_FLAGS $ENV{CXX_FLAGS} CACHE FORCE "")
    SET(CMAKE_CXX_FLAGS_DEBUG $ENV{CXX_FLAGS_DEBUG} CACHE FORCE "")
    SET(CMAKE_CXX_FLAGS_RELEASE $ENV{CXX_FLAGS_RELEASE} CACHE FORCE "")
    SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO $ENV{CXX_FLAGS_RELWITHDEBINFO} CACHE FORCE "")
    
    SET(CMAKE_CXX_LINK_FLAGS $ENV{CMAKE_EXE_LINKER_FLAGS} CACHE FORCE "")
    SET(CMAKE_C_LINK_FLAGS $ENV{CMAKE_EXE_LINKER_FLAGS} CACHE FORCE "")
    SET(CMAKE_CXX_LINK_FLAGS_RELEASE $ENV{CMAKE_EXE_LINKER_FLAGS} CACHE FORCE "")
    SET(CMAKE_CXX_LINK_FLAGS_DEBUG $ENV{CMAKE_EXE_LINKER_FLAGS} CACHE FORCE "")
    
    # C
    #SET(CMAKE_C_FLAGS $ENV{C_FLAGS} CACHE FORCE "")
    SET(CMAKE_C_FLAGS_DEBUG $ENV{C_FLAGS_DEBUG} CACHE FORCE "")
    SET(CMAKE_C_FLAGS_RELEASE $ENV{C_FLAGS_RELEASE} CACHE FORCE "")
    SET(CMAKE_C_FLAGS_RELWITHDEBINFO $ENV{C_FLAGS_RELWITHDEBINFO} CACHE FORCE "")
    
    # where is the target environment 
    SET(CMAKE_FIND_ROOT_PATH ${COMPILER_ROOT})
    
    # search for programs in the build host directories
    SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
    # for libraries and headers in the target directories
    SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
    SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
    
  • Настройте другие параметры в соответствии с вашими потребностями, например, EXECUTABLE_OUTPUT_PATH LIBRARY_OUTPUT_PATH CMAKE_BUILD_TYPE CMAKE_CFLAGS_DEBUG CMAKE_F для создания сторонней библиотеки для сторонних разработчиков и других сторонних библиотек.1060 *

  • Нажмите Настроить , затем Генерируйте ;проверить возможные ошибки (все должно работать без сбоев, но вы никогда не узнаете)
  • Если на этапе генерации все прошло нормально, то cd в папку build , введите сделать , затем сесть и расслабиться, пока процесс сборки не будет завершен
0 голосов
/ 23 октября 2010

Интересно, что я сейчас пытаюсь получить версию 2.1.0 для ARM.Он опирается на cmake, который является настоящей болью, чтобы попытаться подготовиться к кросс-компиляции.Нет никакого способа указать, какой набор инструментов использовать, я должен определить имена переменных для всех binutils, надеясь не забыть их.Есть еще куча магически определенных переменных, которые мешают его созданию, я сейчас сдаюсь.Я все еще вижу магическое добавление -march = i686 и ссылки на некоторые библиотеки из моей системы сборки.Какой беспорядок!

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

0 голосов
/ 03 сентября 2010

Похоже, вы используете старую версию OpenCv, поскольку она все еще использует механизм .configure.В некотором смысле это хорошо, потому что CMake, как известно, не подходит для кросс-компиляции.

LDFLAGS="-L/opt/Montavista/pro/devkit/arm/v5t_le/target/usr/lib"

Здесь компоновщик будет искать библиотеки.Этого должно быть достаточно.Вы уверены, что библиотеки, необходимые OpenCV, находятся в этой переменной PATH?

Первым хаком было бы переименовать библиотеки в / usr / lib, чтобы компоновщик их не нашел, и не нашел ли онцелевые библиотеки.Это уродливо, может быть, более чем уродливо.Не делай этого.Пока что.

Второе решение - сделать нативную компиляцию.Но это эмулируемая коробка ARM, а не на реальном, медленном и некачественном оборудовании.У меня также нет опыта работы с этим методом кросс-компиляции, но вот ссылка , чтобы вы начали.

РЕДАКТИРОВАТЬ Подождите !! Какую версию OpenCV вы используете?Я думал, что OpenCV не использует .configure et al.?Вероятно, есть более элегантное решение, использующее флаги .configure.Или, может быть, не необязательные библиотеки как-то жестко запрограммированы.

...