zoukankan      html  css  js  c++  java
  • 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的编译器,就不需要把高版本的glibclibstdc++拷上去了。

    下面是我在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
    

    GDALmake.optapps/GNUmakefile

    编译后程序运行注意事项

    因为这里编译的时候使用的gcc版本比较高,链接的glibclibstdc++版本也比较高,而运行的机器(华为云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} $@
      
  • 相关阅读:
    activiti 自定义用户
    Activiti6 应用安装 activiti-admin,activiti-app,activiti-rest
    jsoup获取标签下的文本(去除子标签的)
    关于idea跳过错误编译的理解, 跳过报错的代码启动项目去debug测试其他正常的代码
    mybatis 使用参数
    AnnotatedElementUtils.findMergedAnnotation作用
    tomcat中AuthenticatorBase简单的安全认证
    tomcat跨域请求过滤器CorsFilter使用的预检preFlight及其他过滤器
    tomcat中SSIPrintenv.java漏洞修复
    Gitlab+Jenkins Pipeline+Docker+k8s+Helm自动化部署实践(干货!)
  • 原文地址:https://www.cnblogs.com/oloroso/p/11129708.html
Copyright © 2011-2022 走看看