我正在尝试交叉编译我的应用程序,该应用程序是用C++编写的,并使用OpenCV用于基于BeagleBone ARM的板。目标操作系统是Ubuntu 13.10,主机操作系统是Ubuntu12.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..&;品牌:
[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
这是一个包含路径问题:bits
目录在${SYSROOT}/usr/include
上不存在(${SYSROOT}
是板的sysroot所在地)。它位于${SYSROOT}/usr/include/arm-linux-gnueabihf
。
将以下行添加到工具链文件中,它就会工作:
set(CMAKE_SYSROOT ${RASPI_SYSROOT})
include_directories(${RASPI_SYSROOT}/usr/include/arm-linux-gnueabihf)
文件/home/alex/arm_root/usr/include/bits/stdlib-float.h
是否存在?请确保使用正确的include目录。在一些工具链中有多个包含目录。尝试在工具链定义文件中添加以下行:
set(CMAKE_CXX_FLAGS "-isystem /home/alex/arm_root/usr/include")
或者所需包含文件所在的任何目录。这将确保编译器为标准头使用正确的路径。