文章目录
SLAM部署系列合集旨在解决SLAM嵌入式设备部署时所遇到的问题,本文主要介绍算法的交叉编译过程
目标开发板:
Linux version 4.19.206 gcc version 6.3.1
Linux ok3568 4.19.206 aarch64 GNU/Linux
编译环境:VMware Ubuntu 18.04.3 LTS
本文交叉编译的函数库包含:openGL、QT5、Boost、openMP、PCL、openCV、GTSAM
其中openGL还依赖了其它10个依赖库,pcl依赖了flann,下面将逐个展开
mesa-12.0.5 (openGL)
这部分参考了树莓派Tools交叉编译OpenGL(mesa-12.0.5)
Mesa是一个在MIT许可证下开放源代码的三维计算机图形库,以开源形式实现了OpenGL的应用程序接口。编译它需要先交叉编译它的10个依赖库:xproto、libXau、libpciaccess、libdrm、xcb-proto、libxcb、libxshmfence、expat、openssl、eudev。后面以指令的形式展开介绍。
依赖包下载地址见:http://www.liuxiangzhen.cn/file?cate=%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7
xproto-7.0.23
一个序列化工具,在libxau交叉编译时需要依赖
https://gitlab.freedesktop.org/xorg/proto/xproto/-/tags
mkdir build
./autogen.sh
make distclean
cd build
CC=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-gcc CXX=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-g++ ../configure --prefix=/usr/local/xproto_7.0.23 --host=arm-linux
CC=aarch64-linux-gcc CXX=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-g++ ../configure --prefix=/usr/local/xproto_7.0.23 --host=arm-linux
make && sudo make install
libXau-1.0.7
用于提供访问窗口显示,交叉编译libxcb需要依赖
CC=aarch64-linux-gcc CXX=aarch64-linux-g++ ../configure --prefix=/usr/local/libxau_1.0.7 --host=arm-linux XAU_CFLAGS="-I/usr/local/xproto_7.0.23/include" XAU_LIBS="-L/usr/local/xproto_7.0.23/lib/"
make
sudo make install
libpciaccess-0.16
通用PCI(周边元件扩展接口)访问库,交叉编译libdrm-2.4.100时需要依赖
CC=aarch64-linux-gcc CXX=aarch64-linux-g++ ../configure --prefix=/usr/local/libpciaccess_0.16 --host=arm-linux
make
sudo make install
libdrm-2.4.100
libdrm是一个用户空间库,用于在Linux、BSD和其他支持ioctl接口的操作系统上访问DRM、直接渲染管理器。该库为IOCTL提供包装函数,以避免直接暴露内核接口,并为具有drm内存管理器的芯片组提供跟踪重定位和缓冲区的支持。
内核DRM驱动程序中的新功能通常需要新的libdrm,但新的libdrm将始终与旧内核一起工作。libdrm是一个底层库,通常由Mesa驱动程序、X驱动程序、libva和类似项目等图形驱动程序使用。交叉编译mesa-12.0.5时需要依赖
--enable-intel
CC=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-gcc CXX=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-g++ ../configure --prefix=/usr/local/libdrm_2.4.100 --host=arm-linux --disable-cairo-tests --enable-intel PCIACCESS_CFLAGS="-I/usr/local/libpciaccess_0.16/include" PCIACCESS_LIBS="-L/usr/local/libpciaccess_0.16/lib"
make
sudo make install
xcb-proto-1.6
xcb proto提供了libxcb用于的XML-xcb协议描述生成其大部分代码和API。单独提供从libxcb到允许其他项目重用,例如语言绑定、协议解析器或文档生成器。交叉编译mesa-12.0.5时需要依赖
https://xcb.freedesktop.org/dist/
CC=aarch64-linux-gcc CXX=aarch64-linux-g++ ../configure --prefix=/usr/local/xcb_proto_1.6 --host=arm-linux
在~/.bashrc里需要将上面两个包的pc文件添加到PKG-CONFIG路径中
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/libdrm_2.4.100/lib/pkgconfig
export PKG_CONFIG_PATH
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/xcb_proto_1.6/lib/pkgconfig
export PKG_CONFIG_PATH
libxcb-1.5
Xlib是X window system协议的标准C绑定,交叉编译mesa-12.0.5时需要依赖
CC=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-gcc CXX=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-g++ ../configure --prefix=/usr/local/libxcb_1.5 --host=arm-linux NEEDED_CFLAGS="-I/usr/local/libxau_1.0.7/include -I/usr/local/xproto_7.0.23/include" NEEDED_LIBS="-L/usr/local/libxau_1.0.7/lib -L/usr/local/xproto_7.0.23/lib"
libxshmfence-1.3
该库提供了一个基于CPU的同步原语,该原语与X SyncFence对象兼容,可以使用文件描述符传递在进程之间共享。交叉编译mesa-12.0.5时需要依赖
CC=aarch64-linux-gcc CXX=aarch64-linux-g++ ../configure --prefix=/usr/local/libxshmfence_1.3 --host=arm-linux XPROTO_CFLAGS="-I/usr/local/xproto_7.0.23/include" XPROTO_LIBS="-L/usr/local/xproto_7.0.23/lib"
expat-2.2.7
Expat是一个面向流的解析器。解析器注册回调(或处理程序)函数,然后开始向其提供文档。当解析器识别文档的各个部分时,它将为该部分调用适当的处理程序(如果您已经注册了一个处理程序)。文档将被分块地提供给解析器,因此可以在获得所有文档之前开始解析。这还允许您解析无法放入内存的非常大的文档。交叉编译mesa-12.0.5时需要依赖
CC=aarch64-linux-gcc CXX=aarch64-linux-g++ ../configure --prefix=/usr/local/expat_2.2.7 --host=arm-linux --without-docbook
openssl-OpenSSL_1_1_1-stable
OpenSSL项目是一个协作项目,旨在开发一个健壮、商业级、功能齐全的开源工具包,实现传输层安全(TLS)协议(包括SSLv3)以及全强度通用密码库。OpenSSL工具包是根据双重许可证(OpenSSL许可证加上SSLeay许可证)进行许可的,这意味着只要满足两个许可证的条件,就可以自由获取和使用它用于商业和非商业目的。交叉编译mesa-12.0.5时需要依赖
../config no-asm --prefix=/usr/local/openssl_1.1.1_stable --cross-compile-prefix=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-
运行报错:unrecognized command line option ‘-m64’
删除掉Makefile里的 -m64
eudev-3.2.5
eudev是Gentoo的udev分支,udev是systemd的Linux内核设备文件管理器。它管理/dev中的设备节点,并在添加或删除设备时处理所有用户空间操作。eudev的目标是获得与现有软件更好的兼容性,如OpenRC init系统、Upstart init系统,旧Linux内核,各种工具链,以及udev所需的任何其他东西(但未得到很好的支持)。交叉编译mesa-12.0.5时需要依赖
CC=aarch64-linux-gcc CXX=aarch64-linux-g++ ../configure --prefix=/usr/local/eudev_3.2.5 --host=arm-linux --disable-selinux --disable-blkid
mesa-12.0.5
Mesa是OpenGL规范的开源实现,是一个用于绘制交互式3D图形的系统。多种设备驱动程序允许Mesa在许多不同的环境中使用,从软件仿真到现代GPU的完整硬件加速。Mesa与其他几个开源项目有联系:直接渲染基础设施和X.org,为Linux、FreeBSD和其他操作系统上的X用户提供OpenGL支持。
CC=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-gcc CXX=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-g++ ../configure --prefix=/usr/local/mesa_12.0.5 --host=arm-linux --disable-cairo-tests --disable-dri3 --disable-glx --disable-egl --disable-intel --enable-gles2 --enable-gles1 --disable-dri --enable-shared-glapi --with-dri-drivers=swrast CPPFLAGS="-I/usr/local/libpciaccess_0.16/include -I/usr/local/eudev_3.2.5/include -I/usr/local/expat_2.2.7/include -I/usr/local/libxshmfence_1.3/include -I/usr/local/xproto_7.0.23/include -I/usr/local/libxcb_1.5/include -I/usr/local/openssl_1.1.1_stable/include -I/usr/local/libdrm_2.4.100/include" LDFLAGS="-L/usr/local/libpciaccess_0.16/lib -L/usr/local/eudev_3.2.5/lib -L/usr/local/expat_2.2.7/lib -L/usr/local/libxshmfence_1.3/lib -L/usr/local/xproto_7.0.23/lib -L/usr/local/libxcb_1.5/lib -L/usr/local/openssl_1.1.1_stable/lib -L/usr/local/libdrm_2.4.100/lib" --enable-autotools --enable-dri --disable-dependency-tracking
QT 5.12.11
Qt是诺基亚开发的一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程。
修改配置文件:qt-everywhere-src-5.12.11/qtbase/mkspecs/linux-aarch64-gnu-g++/qmake.conf
#
# qmake configuration for building with aarch64-linux-gnu-g++
#
MAKEFILE_GENERATOR = UNIX
CONFIG += incremental
QMAKE_INCREMENTAL_STYLE = sublib
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
# modifications to g++.conf
QMAKE_CC = /home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-gcc
QMAKE_CXX = /home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-g++
QMAKE_LINK = /home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-g++
QMAKE_LINK_SHLIB = /home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-g++
# modifications to linux.conf
QMAKE_AR = /home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-ar cqs
QMAKE_OBJCOPY = /home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-objcopy
QMAKE_NM = /home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-nm -P
QMAKE_STRIP = /home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-strip
load(qt_config)
./configure -v -opensource -confirm-license -no-pch -no-xcb -no-opengl -opengl es2 -make libs -xplatform linux-aarch64-gnu-g++ -compile-examples -device-option -no-gcc-sysroot -prefix /usr/local/qt5 -qreal float
./configure -release -opengl es2 -xplatform linux-aarch64-gnu-g++ -device-option CROSS_COMPILE=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux- -no-gcc-sysroot -opensource -confirm-license -skip qtwayland -skip qtlocation -skip qtscript -make libs -prefix /usr/local/qt5 -no-use-gold-linker -v -no-gbm
boost 1.66
Boost库是为C++语言标准库提供扩展的一些C++程序库的总称,由Boost社区组织开发、维护。
./bootstrap.sh --prefix=/usr/local/boost_1.66
修改project-config.jam
if ! gcc in [ feature.values <toolset> ]
{
using gcc : : /home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-gcc ;
}
./bjam
sudo ./bjam install
openMP
OpenMp提供了对于并行描述的高层抽象,降低了并行编程的难度和复杂度,这样程序员可以把更多的精力投入到并行算法本身,而非其具体实现细节。对基于数据分集的多线程程序设计,OpenMP是一个很好的选择。同时,使用OpenMP也提供了更强的灵活性,可以较容易的适应不同的并行系统配置。线程粒度和负载平衡等是传统多线程程序设计中的难题,但在OpenMp中,OpenMp库从程序员手中接管了部分这两方面的工作。
git clone https://github.com/lapesd/libgomp.git
cd libgomp/src/libgomp && mkdir build && cd build
../configure –host=arm-linux CC=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-gcc CXX=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-g++ prefix=/usr/local/libgomp –disable-multilib
make
pcl 1.8.1
Point Cloud Library
交叉编译pcl1.12.0失败,可能因为依赖的编译器版本需要高于C++14
libpcap
交叉编译 pcl 需要依赖,也可以不依赖
CC=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-gcc CXX=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-g++ ../configure --prefix=/usr/local/libpcap_1.8.1 --host=arm-linux --with-pcap=linux
flann 1.8.1
FLANN 库全称是 Fast Library for Approximate Nearest Neighbors,它是目前最完整的(近似)最近邻开源库。不但实现了一系列查找算法,还包含了一种自动选取最快算法的机制。
cmake .. -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_C_COMPILER=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-gcc -DCMAKE_CXX_COMPILER=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-g++ -DCMAKE_INSTALL_PREFIX=/usr/local/flann
pcl
最早用的是flann1.9.1,由于缺少lz4库,换成了1.8.1顺利编译通过。
cmake .. -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_C_COMPILER=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-gcc -DCMAKE_CXX_COMPILER=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-g++ -DCMAKE_INSTALL_PREFIX=/usr/local/pcl -DBUILD_MATLAB_BINDINGS=OFF
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CmKII1hy-1664360967635)(image/openGL交叉编译/image-20220824093529169.png)]
include_directories( "/usr/local/eigen3/include" )
set(EIGEN_INCLUDE_DIR "/usr/local/eigen3/include/eigen3")
set(Eigen_DIR "/usr/local/eigen3/share/eigen3/cmake")
set(FLANN_INCLUDE "/usr/local/flann")
set(FLANN_INCLUDE_DIR "${FLANN_INCLUDE}/include")
set(FLANN_LIBRARY "${FLANN_INCLUDE}/lib")
include_directories( "${FLANN_INCLUDE}/include" )
set(OPENGL_opengl_LIBRARY "/usr/local/mesa_12.0.5/lib")
set(OPENGL_glx_LIBRARY "/usr/local/mesa_12.0.5/lib")
set(GLEW_LIBRARY "/usr/local/mesa_12.0.5/lib")
set( BOOST_LIBRARYDIR "/usr/local/boost_1.66/lib" )
include_directories( "/usr/local/boost_1.66/include" )
opencv 3.4.0 (contrib)
cmake -D CMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/usr/local/opencv_3.4.0 -DINSTALL_C_EXAMPLES=ON -DOPENCV_EXTRA_MODULES_PATH=/home/forlinx/Downloads/opencv_contrib-3.4.0/modules -DWITH_CUDA=OFF -DWITH_CUFFT=OFF -DWITH_CUBLAS=OFF -DWITH_TBB=OFF -DWITH_V4L=OFF -DWITH_QT=OFF -DWITH_GTK=OFF -DWITH_OPENGL=OFF -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_C_COMPILER=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-gcc -DCMAKE_CXX_COMPILER=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-g++ ..
错误:png_init_filter_functions_neon
3rdparty/libpng/CMakeLists.txt
SET(ARM 1)
SET(ENABLE_NEON 1)
GTSAM-4.1.0
cmake -D CMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=/usr/local/gtsam_4.1.0 -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_C_COMPILER=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-gcc -DCMAKE_CXX_COMPILER=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-g++ -DCMAKE_BUILD_TYPE=RELEASE -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF -DGTSAM_WITH_TBB=OFF ..
VL-FAST-SLAM
一个快速鲁棒的激光视觉SLAM算法
开源地址:https://github.com/MrLiuXiangzhen/VL-FAST-SLAM.git
修改cmake,指定链接库地址
# cross compiler
include_directories( "/usr/local/eigen3/include" )
set(EIGEN_INCLUDE_DIR "/usr/local/eigen3/include/eigen3")
set(Eigen_DIR "/usr/local/eigen3/share/eigen3/cmake")
set(FLANN_INCLUDE "/usr/local/flann")
set(FLANN_INCLUDE_DIR "${FLANN_INCLUDE}/include")
set(FLANN_LIBRARY "${FLANN_INCLUDE}/lib")
include_directories( "${FLANN_INCLUDE}/include" )
set(OPENGL_opengl_LIBRARY "/usr/local/mesa_12.0.5/lib")
set(OPENGL_glx_LIBRARY "/usr/local/mesa_12.0.5/lib")
set(GLEW_LIBRARY "/usr/local/mesa_12.0.5/lib")
set(BOOST_INCLUDE_DIR "/usr/local/boost_1.66/include")
set(BOOST_LIBRARYDIR "/usr/local/boost_1.66/lib" )
include_directories( "/usr/local/boost_1.66/include" )
set(Ceres_INCLUDE_DIR "/usr/local/ceres/include")
set(PCL_INCLUDE_DIR "/usr/local/pcl/include/pcl-1.8")
include_directories( "/usr/local/libgomp/lib/gcc/arm-linux/4.9.1/include" )
set(OpenMP_C_FLAGS "/usr/local/libgomp/lib/gcc/arm-linux/4.9.1/include")
set(OpenMP_C_LIB_NAMES "/usr/local/libgomp/lib64/")
set(OpenMP_CXX_FLAGS "/usr/local/libgomp/lib64/libgomp.so")
交叉编译
cmake -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_C_COMPILER=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-gcc -DCMAKE_CXX_COMPILER=/home/forlinx/3568/OK3568-linux-source/buildroot/output/OK3568/host/bin/aarch64-linux-g++ .. -DOpenMP_C_FLAGS=-fopenmp=lomp -DOpenMP_CXX_FLAGS=-fopenmp=lomp -DOpenMP_C_LIB_NAMES="libomp" -DOpenMP_CXX_LIB_NAMES="libomp" -DOpenMP_libomp_LIBRARY="/usr/local/libgomp/lib64/libgomp.so" -DOpenMP_CXX_FLAGS="-Xpreprocessor -fopenmp /usr/local/libgomp/lib64/libgomp.so -I/usr/local/libgomp/lib/gcc/arm-linux/4.9.1/include/" -DOpenMP_CXX_LIB_NAMES="libomp" -DOpenMP_C_FLAGS="-Xpreprocessor -fopenmp /usr/local/libgomp/lib64/libgomp.so -I/usr/local/libgomp/lib/gcc/arm-linux/4.9.1/include/"
编译好的依赖库 /usr/local/* 可以直接打包发送到开发板端用于可执行文件的链接