使用带有OpenCV的ARM的cmake进行交叉编译

时间:2014-04-16 13:37:11

标签: c++ linux opencv cmake cross-compiling

我正在尝试交叉编译我的应用程序,用C ++编写并使用OpenCV用于基于ARM的BeagleBone板。目标操作系统是Ubuntu 13.10,主机操作系统是Ubuntu 12.04,我可以使用本机编译器在两个系统上成功构建应用程序。但是,当我使用Ubuntu存储库中的arm交叉编译器进行交叉编译时,我收到有关缺少标准头文件(bits / stdlib-float.h)的错误。这是一个显示相同问题的小例子(arm_root目录包含目标环境)。

的src / cross.cpp:

#include <opencv2/opencv.hpp>

int main()
{
    cv::Mat m(10, 10, CV_8UC1);
    return 0;
}

的CMakeLists.txt:

cmake_minimum_required(VERSION 2.6)
find_package(OpenCV REQUIRED)
add_executable(cross src/cross.cpp)
target_link_libraries(cross ${OpenCV_LIBS})

arm_toolchain.cmake(想法是将应用程序链接到主机交叉编译器环境中的标准C ++库,但链接到目标环境中的OpenCV。我不确定这是否是正确的选择):

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_C_COMPILER /usr/bin/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/arm-linux-gnueabihf-g++)
set(CMAKE_FIND_ROOT_PATH /usr/arm-linux-gnueabihf /home/alex/arm_root)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

cmake -DCMAKE_TOOLCHAIN_FILE = .. / arm_toolchain.cmake ..&amp;&amp;使:

[100%] Building CXX object CMakeFiles/cross.dir/src/cross.cpp.o
In file included from /home/alex/arm_root/usr/include/opencv2/core/types_c.h:56:0,
                 from /home/alex/arm_root/usr/include/opencv2/core/core_c.h:47,
                 from /home/alex/arm_root/usr/include/opencv2/opencv.hpp:46,
                 from /home/alex/sandbox/cmake/cross/src/cross.cpp:1:
/home/alex/arm_root/usr/include/stdlib.h:951:31: fatal error: bits/stdlib-float.h: No such file or directory
compilation terminated.
make[2]: *** [CMakeFiles/cross.dir/src/cross.cpp.o] Error 1
make[1]: *** [CMakeFiles/cross.dir/all] Error 2
make: *** [all] Error 2

2 个答案:

答案 0 :(得分:2)

这是一个包含路径问题:bits目录在${SYSROOT}/usr/include上不存在(${SYSROOT}是您的Raspberry Pi的sysroot所在的位置)。它位于${SYSROOT}/usr/include/arm-linux-gnueabihf

将以下行添加到您的工具链文件中,它将起作用:

    set(CMAKE_SYSROOT ${RASPI_SYSROOT})
    include_directories(${RASPI_SYSROOT}/usr/include/arm-linux-gnueabihf)

答案 1 :(得分:1)

文件/home/alex/arm_root/usr/include/bits/stdlib-float.h是否存在?确保使用正确的include目录。在一些工具链中有多个包含目录。尝试将以下行添加到工具链定义文件中:

set(CMAKE_CXX_FLAGS "-isystem /home/alex/arm_root/usr/include")

或所需包含文件所在的目录。这将确保编译器使用标准标头的正确路径。