【cartographer without ros】九、cartographer的交叉编译(Arm)

上一节介绍了使用cartographer封装的接口实现对应的建图,存储和定位等功能。
本节将介绍cartographer的交叉编译,方便进行多平台的移植(以arm为例)。

1:Boost交叉编译

交叉编译 zlib:

下载 http://www.zlib.net/zlib-1.2.11.tar.gz , 解压至 ~/Code,执行

cd ~/Code/zlib-1.2.11
./configure

修改Makefile

line:19 CC=/opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc -march=armv7-a -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.7/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi
line:29 LDSHARED=/opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map
line:30 CPP=/opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc -E
line:38 AR=/opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-ar
line:40 RANLIB=/opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-ranlib

执行

sudo make PREFIX=/use/local
sudo make install

交叉编译 bzip2:

参考 https://blog.csdn.net/bigfanofloT/article/details/107389914

执行

cd ~/Code
git clone git://sourceware.org/git/bzip2.git
cd bzip2

修改 Makefile-libbz2_so

line:24 SHELL=/bin/bash
line:25 CC=/home/vmuser/toolchain/binaries/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc

执行

make -f Makefile-libbz2_so

交叉编译 boost:

下载 https://boostorg.jfrog.io/ui/native/main/release/1.65.1/source/ 中的 boost_1_65_1.tar.gz, 解压至 ~/Code,执行

cd ~/Code/boost_1_65_1
./bootstrap.sh

修改 project-config.jam

Line:12 	using gcc : : /opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc -march=armv7-a -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.7/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi ;

修改 /usr/include/python2.7/pyconfig.h

Line:25 include <python2.7/pyconfig.h>

执行

sudo ./b2 abi=aapcs PREFIX=/use/local
sudo ./b2 install

2:Google交叉编译

交叉编译 glog:

执行

cd ~/Code
git clone https://github.com.cnpmjs.org/google/glog.git
cd glog
mkdir build
cd build
source /opt/poky/1.7/environment-setup-cortexa9hf-vfp-neon-poky-linux-gnueabi
cmake .. -G Ninja
ninja
sudo ninja install

交叉编译 gtest:

执行

apt-get install libgtest-dev
sudo cp /usr/src/googletest ~/home/Code/googletest
cd ~/Code/googletest
mkdir build
cd build
source /opt/poky/1.7/environment-setup-cortexa9hf-vfp-neon-poky-linux-gnueabi
cmake .. -G Ninja
ninja
sudo ninja install

交叉编译 gflags:

执行

cd ~/Code
git clone https://github.com.cnpmjs.org/gflags/gflags
cd gflags
mkdir build
cd build
source /opt/poky/1.7/environment-setup-cortexa9hf-vfp-neon-poky-linux-gnueabi
cmake .. -G Ninja
ninja
sudo ninja install

3:Lua交叉编译

交叉编译 lua5.2:

参考 https://blog.csdn.net/adlindary/article/details/80484986

下载 http://www.lua.org/ftp/lua-5.2.4.tar.gz 解压至 ~/Code

修改Makefile

Line:8 PLAT= linux
Line:44 TO_LIB= liblua.a liblua.so

修改src/Makefile :

PLAT= linux

CC=/opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gcc -march=armv7-a -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=cortex-a9 --sysroot=/opt/poky/1.7/sysroots/cortexa9hf-vfp-neon-poky-linux-gnueabi 
CFLAGS= -fPIC -O2 -Wall -Wextra -DLUA_COMPAT_5_2 $(SYSCFLAGS) $(MYCFLAGS)
LDFLAGS= $(SYSLDFLAGS) $(MYLDFLAGS)
LIBS= -lm $(SYSLIBS) $(MYLIBS)

AR= /opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-ar rcu
RANLIB= /opt/poky/1.7/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-ranlib
RM= rm -f

SYSCFLAGS= -fexpensive-optimizations -frename-registers -fomit-frame-pointer -ftree-vectorize   -Wno-error=maybe-uninitialized -finline-functions -finline-limit=64  -include quectel-features-config.h -fstack-protector-strong -pie -fpie -Wa,--noexecstack 
SYSLDFLAGS= -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -Wl,-z,relro,-z,now,-z,noexecstack
...
LUA_SO=	liblua.so
...
ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T) $(LUA_SO)
...
$(LUA_SO): $(CORE_O) $(LIB_O)
	$(CC) -o $@ -shared $? -ldl -lm
...
linux:
$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl"

修改luaconf.h

Line:46 // #define LUA_USE_READLINE	/* needs some extra libraries */

执行

cd ~/Code/lua-5.2.4
sudo make PREFIX=./build
sudo make install

4:ceres-solver交叉编译

配置新的交叉工具链

(原来的交叉工具链没有gfortran)

参考:https://blog.csdn.net/p1279030826/article/details/105021536

执行

cd ~/toolchain/binaries
wget https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabihf/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
tar -vxf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz 

新建文件 environment-setup

export PATH=$PATH:$HOME/toolchain/binaries/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
export CC="arm-linux-gnueabihf-gcc"
export CXX="arm-linux-gnueabihf-g++"
export FC="arm-linux-gnueabihf-gfortran"

执行

source ~/toolchain/binaries/environment-setup
arm-linux-gnueabihf-gcc -v

交叉编译 lapack:

下载 https://www.netlib.org/lapack/#_lapack_version_3_10_0_2/ 中的 lapack-3.10.0.tar.gz, 解压至 ~/Code,make.inc.example 重命名为 make.inc,执行

cd ~/Code/lapack-3.10.0
mkdir build
cd build
source ~/toolchain/binaries/environment-setup
cmake ..
make 
sudo make install

交叉编译 OpenBLAS:

参考 https://blog.csdn.net/XZZPPP/article/details/69624749

执行

cd ~/Code
git clone https://github.com.cnpmjs.org/xianyi/OpenBLAS.git
cd OpenBLAS
source ~/toolchain/binaries/environment-setup
make TARGET=ARMV7 HOSTCC=gcc BINARY=32 CC=arm-linux-gnueabihf-gcc FC=arm-linux-gnueabihf-gfortran
sudo make install

交叉编译 SuiteSparse:

参考 https://blog.csdn.net/qq_21795137/article/details/120535539

执行

cd ~/Code
git clone  https://github.com.cnpmjs.org/jluttine/suitesparse.git
cd suitesparse

修改SuiteSparse_config/SuiteSparse_config.mk 

Line:113
    AUTOCC ?= no

    ifneq ($(AUTOCC),no)
        ifneq ($(shell which icc 2>/dev/null),)
            # use the Intel icc compiler for C codes, and -qopenmp for OpenMP
            CC = arm-linux-gnueabihf-gcc
            CFLAGS += -D_GNU_SOURCE
            CXX = arm-linux-gnueabihf-g++
            CFOPENMP = -qopenmp -I$(MKLROOT)/include
            LDFLAGS += -qopenmp
            LDLIBS += -lgfortran
        endif
        ifneq ($(shell which ifort 2>/dev/null),)
            # use the Intel ifort compiler for Fortran codes
            F77 = arm-linux-gnueabihf-gfortran
        endif
    endif

    CUDA=no
    CMAKE_OPTIONS += -DCMAKE_CXX_COMPILER=$(CXX) -DCMAKE_C_COMPILER=$(CC) 

Line:164 LAPACK ?= -llapack -lgfortran  

执行

source ~/toolchain/binaries/environment-setup
make
sudo make install

交叉编译 ceres

参考 https://blog.csdn.net/fb_941219/article/details/88526157
参考 https://blog.csdn.net/qq_21795137/article/details/120535539

执行

cd ~/Code
VERSION="1.13.0".
git clone https://github.com.cnpmjs.org/ceres-solver/ceres-solver.git
cd ceres-solver
git checkout tags/${VERSION}

删除 /usr/local/share/cmake-x.y/Modules/FindLAPACK.cmake
删除 /usr/local/share/cmake-x.y/Modules/FindBLAS.cmake
修改 CMakeLists.txt

Line:245
if (LAPACK)
  SET(LAPACK_DIR /usr/local/lib/cmake/lapack-3.10.0)
  find_package(LAPACK QUIET)
  if (LAPACK_FOUND)
    message("-- Found LAPACK library: ${LAPACK_LIBRARIES}")
  else (LAPACK_FOUND)
    update_cache_variable(LAPACK OFF)
    list(APPEND CERES_COMPILE_OPTIONS CERES_NO_LAPACK)
    message("-- Did not find LAPACK library, disabling LAPACK support.")
  endif (LAPACK_FOUND)
else (LAPACK)
  message("-- Building without LAPACK.")
  list(APPEND CERES_COMPILE_OPTIONS CERES_NO_LAPACK)
endif (LAPACK)

修改 cmake/FindSuiteSparse.cmake

Line:178
list(APPEND SUITESPARSE_CHECK_INCLUDE_DIRS
  /opt/local/include
  /opt/local/include/ufsparse # Mac OS X
  /usr/local/homebrew/include # Mac OS X
  /usr/local/include
  /usr/include
  /home/vmuser/Code/suitesparse/include #suitesparse对应路径
)
list(APPEND SUITESPARSE_CHECK_LIBRARY_DIRS
  /opt/local/lib
  /opt/local/lib/ufsparse # Mac OS X
  /usr/local/homebrew/lib # Mac OS X
  /usr/local/lib
  /usr/lib
  /home/vmuser/Code/suitesparse/lib #suitesparse对应路径
)

执行

mkdir build
cd build
source ~/toolchain/binaries/environment-setup
cmake .. -G Ninja -DCXX11=ON
#有可能在此报错找不到fortran库,可以手动在Makefile添加fortran的链接库
ninja
sudo ninja install

5:protobuf交叉编译

交叉编译 protobuf :

参考 https://blog.csdn.net/qq_33446100/article/details/114024776

安装 Google protobuf,执行

cd ~/Code
git clone https://github.com.cnpmjs.org/google/protobuf.git
cd protobuf
git checkout tags/${VERSION}
./autogen.sh
mkdir x86_64_build 
cd x86_64_build 
../configure --prefix=$HOME/Code/protobuf/x86_64_pb_install
make install

安装Google protobuf arm版本,执行

cd ~/Code/protobuf
mkdir arm64_build
cd arm64_build
source ~/toolchain/binaries/environment-setup
../configure --host=aarch64-linux \
 --prefix=/usr/local \
 --with-protoc=$HOME/Code/protobuf/x86_64_pb_install/bin/protoc
make install

6:cartographer交叉编译

交叉编译 absl:

执行

cd ~/Code
git clone https://github.com.cnpmjs.org/abseil/abseil-cpp.git
cd abseil-cpp
git checkout d902eb869bcfacc1bad14933ed9af4bed006d481
mkdir build
cd build
source ~/toolchain/binaries/environment-setup
cmake -G Ninja \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
  -DCMAKE_INSTALL_PREFIX=/usr/local/stow/absl \
  ..
ninja
sudo ninja install
cd /usr/local/stow
sudo stow absl

交叉编译 xzUtils:

在https://tukaani.org/xz/ 中下载 xz-5.2.5.tar.gz 接下到~/Code中,执行

cd ~/Code/xz-5.2.5
./autogen.sh
mkdir x86_64_build 
cd x86_64_build 
../configure --prefix=$HOME/Code/xz-5.2.5/x86_64_pb_install
make install
//安装 arm版本
cd ~/Code/xz-5.2.5
mkdir arm64_build
cd arm64_build
source ~/toolchain/binaries/environment-setup
../configure --host=aarch64-linux \
 --prefix=/usr/local \
 --with-protoc=$HOME/Code/xz-5.2.5/x86_64_pb_install/bin/protoc
make install

交叉编译 cartographer: 

删除CmakeLists 行302-336

修改 cmake/modules/FindLuaGoogle.cmake

Line:211 SET(LUA_MATH_LIBRARY /home/vmuser/toolchain/binaries/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib/libm.so)
Line:212 find_package(Lua)

修改 cartographer/mapping/internal/imu_based_pose_extrapolator.h

Line:43 static std::unique_ptr<ImuBasedPoseExtrapolator> InitializeWithImu(

修改 cartographer/mapping/internal/imu_based_pose_extrapolator.cpp

Line:49 std::unique_ptr<ImuBasedPoseExtrapolator>

执行

cd ~/Code
cd cartographer
mkdir build
cd build
source ~/toolchain/binaries/environment-setup
cmake .. -G Ninja
ninja
#这一步可能会有一些库链接的报错,在build/build.ninja修改对应的库链接后重试
sudo ninja install

【完】


到此完成了cartographer到arm平台的交叉编译。
下一节将对脱离ros环境下使用cartographer做一个简单小结。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CloudFlame

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值