GEOS/GDAL 交叉编译ARM64-linux版本
因为试用华为云ARM64服务器(CentOS 7 操作系统)的时候,在云服务器上编译GDAL很长时间也没有编译完,所以先交叉编译适合版本的GDAL丢上去做测试。
以下都是在CentOS 7 x86_64 环境下进行的,Linux内核版本3.10。
安装编译环境
1、下载安装编译器
我这里因为他们没有提供编译环境,只能去arm的网站下载了。华为的海思嵌入式平台之前接触过,是需要使用提供他们的编译器的。
# 这里可以去 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的编译器,就不需要把高版本的glibc
、libstdc++
拷上去了。
下面是我在OpenSUSE下又重新编译了一次,相关命令的记录
# 下载安装编译器
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
编译后程序运行注意事项
因为这里编译的时候使用的gcc版本比较高
,链接的glibc
和libstdc++
版本也比较高,而运行的机器(华为云ARM服务器)上的版本比较低一点,所以导致无法正确运行,需要把依赖的库拷贝上去。
1、拷贝
gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz
压缩包内的/aarch64-linux-gnu/lib64
目录下所有.so
到目标机器上的/opt/gcc-8.3-lib64
目录下。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} $@
GEOS/GDAL 交叉编译ARM64-linux版本的更多相关文章
- 使用VS+VisualGDB编译Linux版本RCF
RPC通信框架--RCF介绍中说了,RCF本身是支持跨平台的,其代码放到Linux平台,是可以通过gcc.make等工具,编译通过的. 官方提供的源码中,只有cmake编译脚本,并没有提供Makefi ...
- 查看linux版本
http://nameyjj.blog.51cto.com/788669/557424 1. 查看内核版本命令: 1) [root@q1test01 ~]# cat /proc/version ...
- 最稳定 性能最好 的 Linux 版本?
Ubuntu太他妈不稳定了,简直是一坨屎 CentOS.Ubuntu.Debian三个linux比较异同http://blog.csdn.net/educast/article/details/383 ...
- Ubuntu下查看linux版本,内核版本,系统位数,gcc版本
1. 查看linux版本 sunny@ubuntu:~$cat /etc/issueUbuntu 11.04 \n \l 2. 查看内核版本1) sunny@ubuntu:~$ cat /proc/ ...
- 为Linux版本Oracle 11gR2配置HugePage
HugePage是Oracle在Linux版本下一种性能优化手段.对于共享内存区域(SGA)的数据库系统,Oracle通常都推荐在操作系统层面配置上HugePage,为Oracle实例准备更大的可用共 ...
- 【转】 如何查看linux版本 如何查看LINUX是多少位
原文网址:http://blog.csdn.net/hongweigg/article/details/7192471 一.如何得知自己正在使用的linux是什么版本呢,下面的几种方法将给你带来答案! ...
- 转:如何查看linux版本 如何查看LINUX是多少位
原文来自于:http://blog.csdn.net/hongweigg/article/details/7192471 一.如何得知自己正在使用的linux是什么版本呢,下面的几种方法将给你带来答案 ...
- 如何查看linux版本
1. 查看内核版本命令: 1) [root@q1test01 ~]# cat /proc/version Linux version 2.6.9-22.ELsmp (bhcompile@crowe ...
- 用lsb_release -a 查看linux版本
1.要通过yum 安装上这个命令的软件包 yum -y install redhat-lsb 2.lsb_release -a 查看linux版本信息
随机推荐
- 搭建前端监控系统(六)JS截屏和录屏篇
怎样定位前端线上问题,一直以来,都是很头疼的问题,因为它发生于用户的一系列操作之后.错误的原因可能源于机型,网络环境,接口请求,复杂的操作行为等等,在我们想要去解决的时候很难复现出来,自然也就无法解决 ...
- 搭建前端监控系统(五)Nodejs怎么搭建消息队列
怎样定位前端线上问题,一直以来,都是很头疼的问题,因为它发生于用户的一系列操作之后.错误的原因可能源于机型,网络环境,接口请求,复杂的操作行为等等,在我们想要去解决的时候很难复现出来,自然也就无法解决 ...
- Java开发环境之Tomcat
查看更多Java开发环境配置,请点击<Java开发环境配置大全> 壹章:Tomcat安装教程 1)去官网下载安装包 http://tomcat.apache.org/ 建议下载压缩包(zi ...
- Centos 7 中的ulimit -n 65535 对进程的文件句柄限制不生效??
今日闲来无事,就看群里大佬吹牛逼了,偶然一条技术疑问提出来了,神奇啊,作为广大老司机技术交流群体竟然还有这么深入的研究? 大佬问:这个文件句柄限制怎么设置了/etc/security/limits.c ...
- Linux运维技术之scp命令使用
命令格式: scp -P 8031 -r 路径1 路径2 命令解释, 其中-P中的P一定要大写,小写不行(这个也是问题的关键,这个大小写耽搁了好长时间) -P 2424表示更改SSH端口后的端口,如 ...
- 多态典型用例之virtual
多态典型用例之virtual 参考:https://www.cnblogs.com/dormant/p/5223215.html 1.虚函数(virtual) (1)在某基类中声明为 virtual ...
- commix 命令注入工具
关于系统命令注入,可以参考这篇文章:命令攻击介绍 系统命令注入场景 在对企业进行安全测试时候,很少会发现系统注入漏洞.这是因为大部分情况下代码业务主要是数据操作.文件操作.逻辑处理和api接口调用等, ...
- jmeter APP接口压力测试
第一步:获取开发文档,了解接口地址和参数名 第二步:jmeter中添加需要测试的接口 a.设计APP的接口框架: b.http请求默认值设置如下: c.接口中应需要用到sign字段,加密字符串与时间戳 ...
- 项目Beta冲刺总结随笔
班级:软件工程1916|W 作业:项目Beta冲刺 团队名称:SkyReach 目标:Beta冲刺Day2 项目Github地址 团队博客汇总 队员学号 队员姓名 个人博客地址 备注 22160010 ...
- 牛客NOIP暑期七天营-提高组6C:分班问题 (组合数)
题意:A班有N个人,B班有M个人,现在要组成一个新的班级C班,为了公平,从AB班各抽相同人数的人. 现在求所有方案中,人数之和是多少. 思路:即求Σ k*C(N,k)*C(M,k); 先忽略这个 ...