麻烦交叉编译ARM9 Montavista Linux的OpenCV

我正在尝试交叉编译OpenCV库,以便在运行Montavista Linux(系统具有ARM926处理器)的embedded式系统上使用它。 我已经设法configuration和生成makefile; 包括第三方库在内的源码都可以正常构build。 链接时遇到麻烦。 出于某种原因,libtool从主机系统(libjpeg,libtiff,libpng)中select一些库,并尝试将它们与ARM9目标文件(显然是错误的)进行链接。 我得到的错误是

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

我不能,我仍然无法弄清楚我的设置是什么错误(我甚至试图直接在ARM9系统上构build库,但不幸的是它有一个非常less量的RAM和gcc扼stream圈)。 我还修改了LD_LIBRARY_PATH envvar以包含目标的系统库并在运行configure和make之前将其导出。 以下是我通过configuration:

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上发现了这个问题 ,但不幸的是它并没有为我提供解决scheme。

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

谢谢

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

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

要求

  • OpenCV 2.0源码tarball
  • CodeSourcery ARM交叉编译器v2009q1或v2010.09(均经过测试)
  • Ubuntu 10.10 / 11.04主机
  • CMake> = 2.6版与CMake GUI

脚步

  • 在你的主机的某个地方打开OpenCV压缩包; cd到该位置并创建一个构建目录
  • 打开CMake GUI。 选择:

    • 源代码在哪里: == 你打开OpenCV压缩包的文件夹的路径
    • 在哪里建立二进制文件: == 您在第一步中创建的生成文件夹的路径
  • 添加一个名为COMPILER_ROOT的新条目作为路径条目,并将其值设置为交叉编译器的路径,例如/ opt / CodeSourcery / Sourcery_G ++ _ Lite / 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到生成文件夹,键入make,然后放松,直到构建过程完成

看来你使用的是旧版本的OpenCv,因为它仍然使用.configure机制。 这在某种意义上是好的,因为CMake并不知道是交叉编译友好的。

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

这是链接器将查找库。 应该够了。 你确定OpenCV需要的库在这个PATH中吗?

第一个Hack将重命名/ usr / lib中的库,以便链接程序找不到它们,并查看它是否找到目标库。 这是丑陋的,也许比丑陋。 不要这样做。 然而。

第二个解决方案是做本地编译。 但它是一个模拟ARM框,而不是真正的,缓慢和内存不佳的硬件。 我没有这种交叉编译方法的经验,但这里是一个链接 ,让你开始。

编辑等待!!,您正在使用哪个版本的OpenCV? 我以为OpenCV没有使用.configure等。 ? 使用.configure标志可能有一个更优雅的解决方案。 或者,也许非单选库是硬编码的。

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

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