GEOS/GDAL 交叉編譯ARM64-linux版本

由於試用華爲雲ARM64服務器(CentOS 7 操做系統)的時候,在雲服務器上編譯GDAL很長時間也沒有編譯完,因此先交叉編譯適合版本的GDAL丟上去作測試。
如下都是在CentOS 7 x86_64 環境下進行的,Linux內核版本3.10。linux

安裝編譯環境

一、下載安裝編譯器c++

我這裏由於他們沒有提供編譯環境,只能去arm的網站下載了。華爲的海思嵌入式平臺以前接觸過,是須要使用提供他們的編譯器的。git

# 這裏能夠去 https://developer.arm.com/tools-and-software/ 網站找
# 注意:要安裝arm-none-linux-gnueabi-gcc,這個是編譯linux程序的
# 不能安裝arm-none-abi-gcc版本,這個是針對裸機程序的
# 參考 arm交叉編譯器gnueabi、none-eabi、arm-eabi、gnueabihf等的區別 https://www.veryarm.com/296.html
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz
# 上面地址是小端序的,大端序版本地址: https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-aarch64_be-linux-gnu.tar.xz

# 解壓
tar -xJf gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz -C /opt/gcc-arm-8.3-x86_64-aarch64-linux
# 導入環境變量中去
export PATH=${PATH}:/opt/gcc-arm-8.3-x86_64-aarch64-linux

我在arm網站上沒找到比較低版本的,在這裏找到了http://releases.linaro.org/components/toolchain/binaries/。我後來在這裏下載了gcc-linaro-4.9.4-2017.01-x86_64_aarch64-linux-gnu.tar.xz的編譯器,就不須要把高版本的glibclibstdc++拷上去了。github

下面是我在OpenSUSE下又從新編譯了一次,相關命令的記錄bash

# 下載安裝編譯器
wget http://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/aarch64-linux-gnu/gcc-linaro-4.9.4-2017.01-x86_64_aarch64-linux-gnu.tar.xz
sudo tar -xJf aarch64-linux-gnu/gcc-linaro-4.9.4-2017.01-x86_64_aarch64-linux-gnu.tar.xz -C /opt
sudo mv /op/gcc-linaro-4.9.4-2017.01-x86_64_aarch64-linux-gnu /opt/aarch64-linux-gnu

export PATH=${PATH}:/opt/aarch64-linux-gnu/bin
export CC=aarch64-linux-gnu-gcc
export CXX=aarch64-linux-gnu-g++

# 下載proj.4代碼編譯
midr code && cd code
git clone -b 4.9 --depth 1 https://github.com/OSGeo/PROJ.git proj.4

cd proj.4
./configure --build=x86_64-pc-linux-gnu --host=aarch64-linux --target=aarch64-linux  --prefix=~/code/install

make -j4 && make install

# 下載geos代碼編譯
cd ~/code
git clone -b svn-3.6 --depth 1 https://github.com/libgeos/geos.git
mdir geos/build && cd geos/build

cmake .. -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ -DCMAKE_FIND_ROOT_PATH=/opt/aarch64-linux-gnu -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY -DCMAKE_INSTALL_PREFIX=~/code/install

make -j4 && make install

# 下載gdal代碼編譯
cd ~/code
git clone -b v2.4.0 --depth 1 https://github.com/OSGeo/gdal.git
cd gdal/gdal
# ./configure --build=x86_64-pc-linux-gnu --host=aarch64-linux --target=aarch64-linux --with-geos=/home/x/code/install/bin/geos-config --prefix=/home/test/code/install

## 使用指定環境變量的方式能夠在生成的GDALmake.opt裏面添加相關的路徑
## 可是HAVE_GEOS等仍是沒有設置爲yes
## 任然須要修改文件,而後添加相關的設置(注意,須要將 -DHAVE_GEOS=1 添加到CFLAGS/CXXFLAGS,不然編譯出來的仍是不支持geos)
## 根據實際狀況,肯定是否添加相關庫連接到LIBS,如proj4就須要添加
CFLAGS=-I/home/x/code/install/include CXXFLAGS=-I/home/x/code/install/include  LDFLAGS=-L/home/x/code/install/lib ./configure --build=x86_64-pc-linux-gnu --host=aarch64-linux --target=aarch64-linux --with-geos=yes--prefix=/home/test/code/install

# 修改 GDALmake.opt 文件,引用 geos和proj 頭文件路徑等
# 修改 apps/GNUmakefile 連接項添加geos和proj(也能夠添加-rpath)
make && make install

編譯PROJ.4

git clone -b 4.9 --depth 1 https://github.com/OSGeo/PROJ.git proj.4
# 由於configure默認設置CC爲gcc,因此這邊必須先設置
export CC=aarch-linux-gun-gcc
export CXX=aarch-linux-gun-g++
# 生成Makefile
./configure --build=x86_64-pc-linux-gnu --host=aarch64-linux --target=aarch64-linux  --prefix=/home/test/arm64/install
# 編譯安裝
make && make install
# 查看下編譯的對不對
file src/.libs/libproj.so.0.8.0
src/.libs/libproj.so.0.8.0: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, not stripped

編譯GEOS

# 我這裏只是須要編譯一下,就不克隆所有了
git clone -b svn-3.6 --depth 1 https://github.com/libgeos/geos.git

mkdir geos/build && cd geos/build

# 執行cmake,生成Makefile。指定使用的編譯器和查找頭文件和庫文件的根目錄
# 參考 CMake設置arm-linux-gcc交叉編譯器 https://www.cnblogs.com/rickyk/p/3875334.html
cmake3 .. -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ \
                -DCMAKE_FIND_ROOT_PATH=/opt/gcc-arm-8.3-x86_64-aarch64-linux -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=ONLY \
                -DCMAKE_INSTALL_PREFIX=/home/test/arm64/install
# 編譯
make && make install
# 查看下編譯的對不對
file lib/libgeos_c.so.1.10.4
lib/libgeos_c.so.1.10.4: ELF 64-bit LSB shared object, ARM aarch64, version 1 (GNU/Linux), dynamically linked, not stripped

編譯GDAL

git clone -b v2.4.0 --depth 1 https://github.com/OSGeo/gdal.git
cd gdal/gdal
# 生成Makefile(實際是GDALMake.opt)
./configure --build=x86_64-pc-linux-gnu --host=aarch64-linux --target=aarch64-linux  --prefix=/home/test/arm64/install
# 開始我添加 --with-geos=./geos-config(這個腳本在geos的編譯目錄下的tools目錄中),結果仍是沒有用
#   只能運行完成以後打開GDALmake.opt文件進行修改
#   找到 GEOS Suport 和 PROJ.4 stuff 位置,修改內容入下面的圖中所示
# 而後對 apps/GNUmakefile 文件也進行修改
#   把其中的 LNK_FLAGS 變量中追加 $(LIBS)

# 編譯安裝
make && make install

GDALmake.optapps/GNUmakefile

編譯後程序運行注意事項

由於這裏編譯的時候使用的gcc版本比較高,連接的glibclibstdc++版本也比較高,而運行的機器(華爲雲ARM服務器)上的版本比較低一點,因此致使沒法正確運行,須要把依賴的庫拷貝上去。服務器

  • 一、拷貝gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz壓縮包內的/aarch64-linux-gnu/lib64目錄下全部.so到目標機器上的/opt/gcc-8.3-lib64目錄下。app

  • 二、拷貝上面所說壓縮包內的aarch64-linux-gnu/libc/lib64/目錄下的全部.so到目標機器上的/opt/gcc-8.3-lib64目錄下。svn

  • 三、寫一個腳原本運行編譯好的程序,腳本內容大體以下:測試

    #!/bin/bash
    if [ $# -lt 1 ];then
            echo "Usage: $0 program args (eg: $0 gdalinfo /mnt/data/1.tif)"
            exit 0
    fi
    # 獲取程序名
    PROGRAM=$1
    # 移位(即命令行參數減去一個)
    shift 1
    # 指定加載so的路徑
    # 動態庫加載順序:1,-rpath;2,LD_LIBRARY_PATH;3,ldconfig指定路徑
    export LD_LIBRARY_PATH=/opt/gcc-8.3-lib64
    exec ${PROGRAM} $@
相關文章
相關標籤/搜索