GEOSGDAL交叉编译ARM64-linux版本
⽬录
因为试⽤华为云ARM64服务器(CentOS 7 操作系统)的时候,在云服务器上编译GDAL很长时间也没有编译完,所以先交叉编译适合版本的GDAL丢上去做测试。
以下都是在CentOS 7 x86_64 环境下进⾏的,Linux内核版本3.10。
安装编译环境
1、下载安装编译器
我这⾥因为他们没有提供编译环境,只能去arm的⽹站下载了。华为的海思嵌⼊式平台之前接触过,是需要使⽤提供他们的编译器的。
# 这⾥可以去 developer.arm/tools-and-software/ ⽹站
# 注意:要安装arm-none-linux-gnueabi-gcc,这个是编译linux程序的
# 不能安装arm-none-abi-gcc版本,这个是针对裸机程序的
# 参考 arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf等的区别 www.veryarm/296.html
wget developer.arm/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_
# 上⾯地址是⼩端序的,⼤端序版本地址: developer.arm/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-aarch64_
# 解压
tar -xJf gcc-arm-8.3-2019.03-x86_ -C /opt/gcc-arm-8.3-x86_64-aarch64-linux
# 导⼊环境变量中去
export PATH=${PATH}:/opt/gcc-arm-8.3-x86_64-aarch64-linux
下⾯是我在OpenSUSE下⼜重新编译了⼀次,相关命令的记录
# 下载安装编译器
wget /components/toolchain/binaries/4.9-2017.01/aarch64-linux-gnu/gcc-linaro-4.9.4-2017.01-x86_64_
sudo tar -xJf aarch64-linux-gnu/gcc-linaro-4.9.4-2017.01-x86_64_ -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 github/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 github/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_INST make -j4 && make install
# 下载gdal代码编译
cd ~/code
git clone -b v2.4.0 --depth 1 github/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 # 修改 GDALmake.opt ⽂件,引⽤ geos和proj 头⽂件路径等
# 修改 apps/GNUmakefile 链接项添加geos和proj(也可以添加-rpath)
make && make install
编译PROJ.4
git clone -b 4.9 --depth 1 github/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 github/libgeos/geos.git
mkdir geos/build && cd geos/build
# 执⾏cmake,⽣成Makefile。指定使⽤的编译器和查头⽂件和库⽂件的根⽬录
# 参考 CMake设置arm-linux-gcc交叉编译器 wwwblogs/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 github/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.opt
apps/GNUmakefile
编译后程序运⾏注意事项
因为这⾥编译的时候使⽤的gcc版本⽐较⾼,链接的glibc和libstdc++版本也⽐较⾼,⽽运⾏的机器(华为云ARM服务器)上的版本⽐较低⼀点,所以导致⽆法正确运⾏,需要把依赖的库拷贝上去。
1、拷贝gcc-arm-8.3-2019.03-x86_压缩包内的/aarch64-linux-gnu/lib64⽬录下所有.so到⽬标机器上的/opt/gcc-8.3-lib64⽬录下。
gnu编译器
2、拷贝上⾯所说压缩包内的aarch64-linux-gnu/libc/lib64/⽬录下的所有.so到⽬标机器上的/opt/gcc-8.3-lib64⽬录下。
3、写⼀个脚本来运⾏编译好的程序,脚本内容⼤致如下:
#!/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} $@

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。