麻烦交叉编译OpenCV for ARM9 Montavista Linux

时间:2010-09-03 13:45:24

标签: c linux opencv cross-compiling

我正在尝试交叉编译OpenCV库,以便在运行Montavista Linux的嵌入式系统上使用它(该系统具有ARM926处理器)。我已设法配置并生成makefile;源代码构建正常,包括第三方库。麻烦来自链接时间。出于某种原因,libtool从主机系统(libjpeg,libtiff,libpng)中选择一些库,并尝试将它们与ARM9目标文件链接(显然这是错误的)。我得到的错误是

/usr/lib/libpng12.so:无法读取符号:文件格式错误

我不能,我仍然无法弄清楚我的设置到底出了什么问题(我甚至试图直接在ARM9系统上构建库,但不幸的是它有很少的RAM和gcc chokes)。我还修改了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上发现了this question,但遗憾的是它没有为我提供解决方案。

我在Montavista Linux for ARM(由TI DM365提供支持的Leopard板),OpenCV 2.0.0上使用gcc版本4.2.0(MontaVista 4.2.0-16.0.32.0801914 2008-08-30)。我的主机系统是Ubuntu 10.4。 关于如何解决这个问题的任何指示都会有很大的帮助。

由于

[更新] [已解决] :在尝试交叉编译时,基于autotools的生成OpenCV 2.0.0的makefile的方法似乎被破坏了(或者由于某些奇怪的原因,它不起作用我)。我使用了CMake GUI并指定了一个合适的toolchain.cmake文件,一切顺利。请参阅下面的答案。

3 个答案:

答案 0 :(得分:2)

使用CMake GUI交叉编译OpenCV 2.0 for ARM的程序

要求

  • OpenCV 2.0 source tarball
  • CodeSourcery ARM交叉编译器v2009q1或v2010.09(均经过测试)
  • Ubuntu 10.10 / 11.04主机
  • CMake> = v2.6 with CMake GUI

步骤

  • 在主机上的某处解压缩OpenCV tarball; cd 到该位置并创建 build 目录
  • 打开CMake GUI。选择:

    • 源代码在哪里: == 解压缩OpenCV tarball文件夹的路径
    • 在哪里构建二进制文件: == 您在第一步中创建的构建文件夹的路径
  • 添加一个名为 COMPILER_ROOT 的新条目作为路径条目,并将其值设置为交叉编译器的路径,例如: 的/ opt / CodeSourcery的/ Sourcery_G ++ _精简版/ bin中

  • 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_CFLAGS_RELEASE ,您要使用的第三方库等。

  • 配置,然后按生成;检查最终的错误(一切都应该顺利进行,但你永远不知道)
  • 如果在生成阶段一切顺利,然后 cd build 文件夹,请输入 make 然后放松一下,直到构建过程完成了

答案 1 :(得分:0)

似乎您使用的是旧版本的OpenCv,因为它仍然使用.configure机制。这在某种意义上是好的,因为CMake不会被认为是交叉编译友好的。

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

这是链接器将寻找库。这应该够了。您确定OpenCV所需的库是否在此PATH中?

第一个Hack将重命名/ usr / lib中的库,以便链接器找不到它们,并查看它是否找到目标库。这很难看,也许不仅仅是丑陋。不要这样做。爱好。

第二种解决方案是进行本机编译。但它是一个模拟的ARM盒子,而不是真实的,缓慢的和内存不佳的硬件。我没有使用这种交叉编译方法的经验,但这里有一个link来帮助你入门。

EDIT 等等!!,您使用的是哪个版本的OpenCV?我以为OpenCV没有使用.configure等。 ?使用.configure标志可能有更优雅的解决方案。或者也许非选择性库以某种方式硬编码。

答案 2 :(得分:0)

有趣的是,我目前正在尝试为ARM构建版本2.1.0。它依赖于cmake,这是一个真正的痛苦,试图为交叉编译做好准备。没有办法指定使用什么工具链,我必须发现所有binutils的变量名称,希望不要忘记任何。还有一堆神奇定义的变量阻止它建立,我现在就放弃了。我仍然看到一些魔法附加的-march = i686和一些从我的构建系统引用的libs。真糟糕!

也许当我有时间时,我会尝试降级到使用更多标准工具的旧版本,但cmake显然使这里的情况复杂化。