我正在尝试交叉编译我的应用程序,用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
答案 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")
或所需包含文件所在的目录。这将确保编译器使用标准标头的正确路径。