我正在尝试交叉编译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文件,一切顺利。请参阅下面的答案。
答案 0 :(得分:2)
使用CMake GUI交叉编译OpenCV 2.0 for ARM的程序
打开CMake GUI。选择:
添加一个名为 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 ,您要使用的第三方库等。
答案 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显然使这里的情况复杂化。