目前在Nvidia TX2
上尝试安装ROS Kinetic
的时候发现依赖libboost-all-dev
,但是自带的源http://ports.ubuntu.com下面没有合适的源,尽管在universe
源下面包含libboost-all-dev
,但是实际安装的时候发现安装不上。
因此尝试手工编译最新的boost
安装包,建立自己的源。
首先,编译安装最新的crosstool-ng
,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
$ sudo apt-get install git $ sudo apt-get install gperf $ sudo apt-get install bison $ sudo apt-get install flex $ sudo apt-get install texinfo $ sudo apt-get install help2man $ sudo apt-get install gawk $ sudo apt-get install libncurses5-dev $ cd ~ $ git clone https://github.com/crosstool-ng/crosstool-ng.git $ cd crosstool-ng $ git checkout crosstool-ng-1.23.0 $ ./bootstrap $ ./configure --prefix=/usr/local $ make $ sudo make install $ cd ~ $ mkdir tx2 $ cd tx2 #用树莓派的模板作为参考模板即可 $ cp ~/crosstool-ng/samples/aarch64-rpi3-linux-gnueabi/crosstool.config .config $ ct-ng oldconfig #默认一路回车即可,如果使用图形界面配置执行 ct-ng menuconfig $ unset LD_LIBRARY_PATH $ ct-ng build |
生成的工具链在~/x-tools/aarch64-rpi3-linux-gnueabi
目录下,编译的时候,指定编译工具即可。
安装编译依赖
1 2 3 4 5 6 7 |
$ sudo apt-get install devscripts $ sudo apt-get install cdbs $ sudo apt-get install python-dev $ sudo apt-get install libbz2-dev |
接着,下载并编译最新的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
#!/bin/bash export DEBVERSION=1.58.0-1 if [ ! -d "boost_1_58_0" ]; then wget "http://nchc.dl.sourceforge.net/project/boost/boost/1.58.0/boost_1_58_0.tar.bz2" -O boost_1_58_0.tar.bz2 tar xjvf boost_1_58_0.tar.bz2 fi cd boost_1_58_0 :<<BLOCK 'export DEBVERSION=1.60.0-1 if [ ! -d "boost_1_60_0" ]; then wget "http://downloads.sourceforge.net/project/boost/boost/1.60.0/boost_1_60_0.tar.bz2" -O boost-all_1.60.0.orig.tar.bz2 tar xjvf boost-all_1.60.0.orig.tar.bz2 fi cd boost_1_60_0 ' BLOCK #Build DEB rm -rf debian mkdir -p debian #Use the LICENSE file from nodejs as copying file touch debian/copying #Create the changelog (no messages needed) dch --create -v $DEBVERSION --package libboost-all "" #Create copyright file touch debian #Create control file cat > debian/control <<EOF Source: libboost-all Maintainer: LongSky <wangqiang1588@sina.com> Section: misc Priority: optional Standards-Version: 3.9.2 Build-Depends: debhelper (>= 8), cdbs, libbz2-dev, zlib1g-dev Package: libboost-all Architecture: arm64 Depends: \${shlibs:Depends}, \${misc:Depends}, libboost-all (= $DEBVERSION) Description: Boost library, version $DEBVERSION (shared libraries) Package: libboost-all-dev Architecture: any Depends: libboost-all (= $DEBVERSION) Description: Boost library, version $DEBVERSION (development files) Package: libboost-build Architecture: any Depends: \${misc:Depends} Description: Boost Build v2 executable EOF #Create rules file cat > debian/rules <<EOF #!/usr/bin/make -f %: dh \$@ override_dh_auto_configure: ./bootstrap.sh override_dh_auto_build: ./b2 link=static,shared -j 1 --prefix=`pwd`/debian/libboost-all/usr/ override_dh_auto_test: override_dh_auto_install: mkdir -p debian/libboost-all/usr debian/libboost-all-dev/usr debian/libboost-build/usr/bin ./b2 link=static,shared --prefix=`pwd`/debian/libboost-all/usr/ install mv debian/libboost-all/usr/include debian/libboost-all-dev/usr cp b2 debian/libboost-build/usr/bin ./b2 install --prefix=`pwd`/debian/libboost-build/usr/ install EOF #Create some misc files echo "8" > debian/compat mkdir -p debian/source echo "3.0 (quilt)" > debian/source/format #Build the package nice -n19 ionice -c3 debuild -b -d -uc -us |
注意,对于boost-1.58
来说,当时的代码是没有检测ARM64
的功能的,当年也没有ARM64
的芯片。因此需要修改{boost_root}/libs/config/checks/architecture/arm.cpp
里面的代码,增加ARM64
的判断
1 2 3 4 5 |
#if !defined(__arm__) && !defined(__thumb__) && \ !defined(__TARGET_ARCH_ARM) && !defined(__TARGET_ARCH_THUMB) && \ !defined(_ARM) && !defined(_M_ARM) #error "Not ARM" #endif |
调整为
1 2 3 4 5 |
#if !defined(__arm__) && !defined(__thumb__) && \ !defined(__TARGET_ARCH_ARM) && !defined(__TARGET_ARCH_THUMB) && \ !defined(_ARM) && !defined(_M_ARM) && !defined(__aarch64__) #error "Not ARM" #endif |