上一节介绍了使用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:
下载 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:
执行
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做一个简单小结。