CGAL的交叉编译-androidlinux-arm64

news2024/10/7 14:33:50

由于项目算法需要从Linux移植到android,原先的CGAL库也需要进行移植,先现对CGAL的移植过程做下记录,主要是其交叉编译的过程.。

前提条件:

1、主机已安装NDK编译器,版本大于19

2、主机已安装cmake 和 make

3、主机已安装gcc-aarch64 编译器

CGAL官网

The Computational Geometry Algorithms Library (cgal.org)

CGAL依赖 gmp  mpfr  boost 库,因此,需要先对这三个依赖进行处理,并且不同的CGAL版本对依赖库的版本要求也不相同,详见其在线文档

CGAL 5.2 - Manual: Main Page

The GNU MPFR Library

The GNU MP Bignum Library (gmplib.org)

Boost C++ Libraries

1、boost库的交叉编译

1.1 aarch64-arm平台

下载安装包后,设置编译脚本build.sh

#!/bin/bash


export CC=/usr/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc
export CXX=/usr/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++

if [ -d "./build" ]; then
    echo "log dir exist"
else
    mkdir build
    echo "touch new build dir"
fi

cd ./build
rm -rf *
cd -

echo $CC
echo $CXX
echo ${PWD}

file_path=project-config.jam
rm -rf b2 $file_path

./bootstrap.sh  --prefix=${PWD}/build --with-toolset=gcc --without-libraries=python

# 检查文件是否存在
if [ ! -f "$file_path" ]; then
    echo "error project-config.jam not exist ."
    exit 1
fi

# 使用sed命令替换文件中的'using gcc'为'using g++'
sed -i "s#using gcc ;#using gcc : : ${CC} ;#g" "$file_path"

./b2 install --prefix=${PWD}/build

tree ./build

解压安装包,并将build.sh脚本放入文件夹内,执行脚本 

sh build.sh

boost交叉编译(arm)-CSDN博客

1.2 android平台

下载boost的安卓编译脚本,并确认安装的ndk版本符合其要求,编译脚本下载路径https://github.com/moritz-wundke/Boost-for-Android

下载完成后,设置编译脚本build.sh

#!/bin/bash

export   NDK=/usr/android-ndk-r25c/
export   PATH=${PATH}:$NDK

./build-android.sh $NDK  #刚才设置的环境变量
#这个工具在编译的时候会自动下载最新版本的boost库,默认编译成静态库;
#如果需要选择特定版本,在执行的时候配置参数:

#刚才设置的环境变量
#./build-android.sh --boost=<version> $NDK
#如果需要编译成so动态库,打开脚本找到:link = static;static改成shared


编译结束在build/out目录下可获得android平台的boost库,其头文件标准路径为,

xxxxxxxx/arm64-v8a/include/boost-1_84/         注意多了一层boost-1_84

库文件路径 xxxxxxxx/arm64-v8a/lib

参考:Android ndk 方式交叉编译boost库_android boost 验证-CSDN博客

2、gmp库的交叉编译

1.1 aarch64-arm平台

aarch64平台下交叉编译器自带了gmp的库和头文件,无需编译,

若需要编译,下载安装包后,设置编译脚本build.sh

#!/bin/bash

export CC=/usr/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc
export CXX=/usr/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
export CXXFLAGS=${CXXFLAGS}:-malign-double

if [ -d "./build" ]; then
    echo "log dir exist"
else
    mkdir build
    echo "touch new build dir"
fi

cd ./build
rm -rf *
cd -

echo $CC
echo $CXX
echo ${PWD}

./configure --host=aarch64-linux-gnu --enable-cxx --prefix=${PWD}/build   

make

make install

tree ./build

 解压安装包,并将build.sh脚本放入文件夹内,执行脚本 

sh build.sh

编译完成后

1.2 android平台

安卓平台下比较简单,将编译器更换即可,参考如下

#!/bin/bash

#ndk version must later than r19
ANDROID_NDK=/usr/android-ndk-r25c/
ANDROID_API_LEVEL=28

export CC=${ANDROID_NDK}toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android${ANDROID_API_LEVEL}-clang
export CXX=${ANDROID_NDK}toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android${ANDROID_API_LEVEL}-clang++
#set aligned,otherwise link static lib wiil occur ld: error:not aligned to 8 bytes
export CXXFLAGS=${CXXFLAGS}:-malign-double
if [ -d "./build" ]; then
    echo "log dir exist"
else
    mkdir build
    echo "touch new build dir"
fi

cd ./build
rm -rf *
cd -

echo $CC
echo $CXX
echo ${PWD}

./configure --host=aarch64-linux-android --enable-cxx --prefix=${PWD}/build   

make

make install

tree ./build

3、mpfr库的交叉编译

1.1 aarch64-arm平台

aarch64平台下交叉编译器自带了gmp的库和头文件,无需编译,

若需要编译,下载安装包后,设置编译脚本build.sh

#!/bin/bash

export CC=/usr/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc
export CXX=/usr/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++

#指定gmp的路径,在第二步安装的目录下
GMP_DIR=/home/ccl/Downloads/boost/gmp-6.3.0/build

if [ -d "./build" ]; then
    echo "log dir exist"
else
    mkdir build
    echo "touch new build dir"
fi

cd ./build
rm -rf *
cd -

echo $CC
echo $CXX
echo ${PWD}

./configure --host=aarch64-linux-gnu --enable-cxx --prefix=${PWD}/build --with-gmp=$GMP_DIR 

make

make install

tree ./build

 解压安装包,并将build.sh脚本放入文件夹内,执行脚本 

sh build.sh

编译完成后,可得到如下

1.2 android平台

安卓平台下比较简单,将编译器更换即可,参考如下

#!/bin/bash

#ndk version must later than r19
ANDROID_NDK=/usr/android-ndk-r25c/
ANDROID_API_LEVEL=28
GMP_DIR=/home/ccl/Downloads/cgal/gmp-6.1.2/build


export CC=${ANDROID_NDK}toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android${ANDROID_API_LEVEL}-clang
export CXX=${ANDROID_NDK}toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android${ANDROID_API_LEVEL}-clang++

if [ -d "./build" ]; then
    echo "log dir exist"
else
    mkdir build
    echo "touch new build dir"
fi

cd ./build
rm -rf *
cd -

echo $CC
echo $CXX
echo ${PWD}

./configure --host=aarch64-linux-android --enable-cxx --prefix=${PWD}/build --with-gmp=$GMP_DIR 

make

make install

tree ./build

4、CGAL的交叉编译

1.1 aarch64-arm平台

 在CGAL的文件目录下新建build和install文件夹

mkdir build install

切换至build目录下,使用cmake-gui进行配置

/usr/cmake-3.23.0-rc2-linux-x86_64/bin/cmake-gui 

进行编译工具配置于 所依赖的 libgmp、libmpfr 、libgmpxx路径设置

勾选以上组件后,设置库的头文件路径于库文件路径

编译器头文件路径于文件安装路径

点击configure按键,观察配置打印log

6,选择gererate,生成的cmake文件就在build目录下

7、进入build目录下执行 sudo make -j4

8、执行 sudo make install

1.2 android平台

在CGAL的文件目录下新建build和install文件夹

mkdir build install

找到CGAL的文件目录下的CMakeLists,在其头部增加以下设置,设置内容分别是android ndk的编译器、gmp gmpxx的头文件和库文件路径、 mpfr的头文件库文件路径、 boost的头文件和库文件路径以及CGAL的编译输出设置等等。
 


#ndk version must later than r19 
SET(ANDROID_NDK  /usr/android-ndk-r25c)
SET(CMAKE_TOOLCHAIN_FILE  ${ANDROID_NDK}/build/cmake/android.toolchain.cmake)
SET(ANDROID_ABI  arm64-v8a)
SET(API_LEVEL  28)
SET(ANDROID_PLATFORM  ${API_LEVEL})
SET(CMAKE_ANDROID_NDK  ${ANDROID_NDK})
SET(ANDROID_LD  default)
SET(ANDROID_STL  c++_static)
#ndk version must later than r19 

#set GMP PATH
SET(GMP_INCLUDE_DIR  /home/ccl/Downloads/boost/gmp-6.3.0/build/include)
SET(GMP_LIBRARIES_DIR  /home/ccl/Downloads/boost/gmp-6.3.0/build/lib)
SET(GMP_LIBRARIES  /home/ccl/Downloads/boost/gmp-6.3.0/build/lib/libgmp.a)

#set GMPXX PATH
SET(GMPXX_INCLUDE_DIR  ${GMP_INCLUDE_DIR})
SET(GMPXX_LIBRARIES  /home/ccl/Downloads/boost/gmp-6.3.0/build/lib/libgmpxx.a)

#set MPFR PATH
SET(MPFR_INCLUDE_DIR  /home/ccl/Downloads/boost/mpfr-4.0.1/build/include)
SET(MPFR_LIBRARIES_DIR  /home/ccl/Downloads/boost/mpfr-4.0.1/build/lib)
SET(MPFR_LIBRARIES  /home/ccl/Downloads/boost/mpfr-4.0.1/build/lib/libmpfr.a)

#set BOOST PATH
SET(BOOST_ROOT  /home/ccl/Downloads/boost/Boost-for-Android-master/build/out/arm64-v8a)
SET(Boost_INCLUDE_DIR  /home/ccl/Downloads/boost/Boost-for-Android-master/build/out/arm64-v8a/include/boost-1_84)
SET(Boost_LIBRARY_DIRS  /home/ccl/Downloads/boost/Boost-for-Android-master/build/out/arm64-v8a/lib/)

#when WITH_CGAL_ImageIO is on, need boost library, here not need
SET(Boost_system_LIBRARY_RELEASE  /home/ccl/Downloads/boost/Boost-for-Android-master/build/out/arm64-v8a/lib/libboost_system-clang-mt-a64-1_84.a)
SET(Boost_thread_LIBRARY_RELEASE  /home/ccl/Downloads/boost/Boost-for-Android-master/build/out/arm64-v8a/lib/libboost_thread-clang-mt-a64-1_84.a)
SET(Boost_date_time_LIBRARY_RELEASE  /home/ccl/Downloads/boost/Boost-for-Android-master/build/out/arm64-v8a/lib/libboost_date_time-clang-mt-a64-1_84.a)
SET(Boost_chrono_LIBRARY_RELEASE  /home/ccl/Downloads/boost/Boost-for-Android-master/build/out/arm64-v8a/lib/libboost_chrono-clang-mt-a64-1_84.a)

#set make install path
SET(CMAKE_INSTALL_PREFIX  /home/ccl/Downloads/boost/CGAL-5.2/install)

SET(WITH_CGAL_ImageIO  OFF)
SET(WITH_CGAL_Qt5  OFF)
SET(CGAL_HEADER_ONLY  FALSE)
SET(CMAKE_BUILD_TYPE  Release)
SET(BUILD_SHARED_LIBS FALSE) #set cgal static library

 cmake变量的定义请参考CGAL官方文档说明:

CGAL 5.4 - Manual: Summary of CGAL's Configuration Variables

添加结束后,在build目录下设置编译脚本build.sh

#!/bin/bash

make clean

/usr/cmake-3.23.0-rc2-linux-x86_64/bin/cmake -DCMAKE_INSTALL_PREFIX=/home/ccl/Downloads/boost/CGAL-5.2/install ../

make -j4

make install

ls ../install/lib

管理员权限运行脚本

sudo sh build.sh

注意:本人使用的ndk版本大于19,当小于19的版本时需要额外使用脚本生成android的编译器,具体可参考以下开源项目

Cross Compilation of CGAL for Android · CGAL/cgal Wiki · GitHub

安卓编译成果:安卓arm64-v8aCGAL及其依赖库资源-CSDN文库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1578949.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从零自制docker-8-【构建实现run命令的容器】

文章目录 log "github.com/sirupsen/logrus"args...go moduleimport第三方包失败package和 go import的导入go build . 和go runcli库log.SetFormatter(&log.JSONFormatter{})error和nil的关系cmd.Wait()和cmd.Start()arg……context.Args().Get(0)syscall.Exec和…

XC7A35T-2FGG484 嵌入式FPGA现场可编程门阵列 Xilinx

XC7A35T-2FGG484 是一款由Xilinx&#xff08;赛灵思&#xff09;制造的FPGA&#xff08;现场可编程门阵列&#xff09;芯片 以下是XC7A35T-2FGG484 的主要参数&#xff1a; 1. 系列&#xff1a;Artix-7 2. 逻辑单元数量&#xff1a;33280个 3. 工艺技术&#xff1a;28nm 4. …

element问题总结之el-table使用fixed中 header换行后固定行错位问题/固定列下陷问题

固定列下陷问题 效果图问题描述解决方案1、为table添加ref2、调用节点重新自适应方法doLayout3、在操作表头的时候触发的函数header-dragend绑定doLayout方法4、成功解决 效果图 问题描述 在使用el-table的fixed中&#xff0c;发现如果header拖拽文本折行的时候会出现下陷 解…

Go操作Kafka之kafka-go

Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;本文介绍了如何使用kafka-go这个库实现Go语言与kafka的交互。 Go社区中目前有三个比较常用的kafka客户端库 , 它们各有特点。 首先是IBM/sarama&#xff08;这个库已经由Shopify转给了IBM&#xff09;&#xff0c;之…

TCP/IP协议、HTTP协议和FTP协议等网络协议简介

文章目录 一、常见的网络协议二、TCP/IP协议1、TCP/IP协议模型被划分为四个层次2、TCP/IP五层模型3、TCP/IP七层模型 三、FTP网络协议四、Http网络协议1、Http网络协议简介2、Http网络协议的内容3、HTTP请求协议包组成4、HTTP响应协议包组成 一、常见的网络协议 常见的网络协议…

uniapp如何配置后使用uni.chooseLocation等地图位置api

在uniapp中想要使用uni.getLocation、uni.chooseLocation ……api的时候我们需要在小程序就开启配置&#xff0c;不然无法使用。 第一步&#xff1a;首先找到manifest.json 第二步&#xff1a;点击源码视图 第三步&#xff1a;在 mp-weixin 加入下面代码 "permission&…

DC-2靶机知识点

知识点总结 1.IP访问与域名访问 2.端口扫描 3.目录扫描 4.cewl密码生成器 5.指纹探测 6.爆破ssh 7.msf的使用 8.rbash逃逸 9.git提权 靶机&#xff0c;攻击机就不多说了&#xff0c;给个靶机地址 https://download.vulnhub.com/dc/DC-2.zip 环境配置 因为访问该靶机…

Python数学建模学习-莱斯利(Leslie)种群模型

Leslie模型是一种用于离散时间的生物种群增长模型&#xff0c;经常用于描述年龄结构对种群增长的影响。在1945年&#xff0c;人口生态学家Patrick H. Leslie&#xff08;莱斯利&#xff09;为了研究具有离散年龄结构的种群&#xff0c;特别是对于有不同年龄阶段的生物&#xff…

鸿蒙OS开发实战:【自动化测试框架】使用指南

概述 为支撑HarmonyOS操作系统的自动化测试活动开展&#xff0c;我们提供了支持JS/TS语言的单元及UI测试框架&#xff0c;支持开发者针对应用接口进行单元测试&#xff0c;并且可基于UI操作进行UI自动化脚本的编写。 本指南重点介绍自动化测试框架的主要功能&#xff0c;同时…

三行命令解决Ubuntu Linux联网问题

一开始我找到官方文档描述可以通过命令行连接到 WiFi 网络&#xff1a;https://cn.linux-console.net/?p10334#google_vignette 但是我的 $ ls /sys/class/net 命令无法显示无线网络接口&#xff0c;那么没有无线网卡&#xff1f; 所以我参照其他的博客在终端超级用户的权…

JUC:ScheduledThreadPoolExecutor 延迟任务线程池的使用

文章目录 ScheduledThreadPoolExecutortimer&#xff08;不建议用&#xff09;ScheduledThreadPoolExecutor处理异常应用 ScheduledThreadPoolExecutor timer&#xff08;不建议用&#xff09; timer也可以进行延迟运行&#xff0c;但是会有很多问题。 比如task1运行时间超过…

FOR循环

oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 前面两种循环都要根据条件是否成立而确定循环体的执行&#xff0c;具体循环体执行多少次事先并不知道。 FOR 循环可以控制循环执行的次数&#xff0c;由循环变量控制循环体的…

学透Spring Boot — 005. 深入理解 Spring Boot Starter 依赖管理

前面的文章直观的展示了&#xff0c;使用Spring Boot 集成 Hibernate 和手动集成 Hibernate 之间差距。 一个比喻 工作中使用过Spring Boot一段时间后&#xff0c;我越来越感觉到Spring Boot Starter带来的便利性。 使用手动集成 Hibernate&#xff0c; 就像去电脑城配电脑&…

二叉树的遍历的递归与非递归算法

一.二叉树的遍历&#xff1a; 按照一定规律对二叉树的每个结点进行访问且仅访问一次&#xff1b; 这里的访问&#xff1a;可以是计算二叉树中的结点数据&#xff0c;打印该结点的信息&#xff0c;也可以是对结点进行的任何其它操作&#xff01; 为什么需要遍历二叉树&#x…

EditPlus来啦(免费使用!)

hello&#xff0c;我是小索奇 今天推荐一款编辑器&#xff0c;是索奇学习JavaSE时入手滴&#xff0c;非常好用哈&#xff0c;小索奇还是通过老杜-杜老师入手滴&#xff0c;相信很多人也是通过老杜认识嘞&#xff0c;来寻找破解版或者准备入手这个间接使用的编辑器~ EditPlus是…

在Ubuntu上搭建Prometheus + Grafana监控系统

1.Prometheus 部署 从官网下载页面找到最新的二进制文件下载 cd ~ curl -LO https://github.com/prometheus/prometheus/releases/download/v2.51.1/prometheus-2.51.1.linux-amd64.tar.gz将文件解压到指定目录 tar xf prometheus-2.51.1.linux-amd64.tar.gz -C /usr/local为…

⼿机客户端画K线图流程

优质博文&#xff1a;IT-BLOG-CN 一、什么是K线流程 K线图是一种用于展示金融市场价格走势的图表。它通常由四个关键价格点组成&#xff0c;即开盘价、收盘价、最高价和最低价。K线图的流程可以简单概括为以下几个步骤&#xff1a; 【1】收集数据&#xff1a; 首先&#xff0c…

Oracle 正则表达式

一、Oracle 正则表达式相关函数 (1) regexp_like &#xff1a;同 like 功能相似&#xff08;模糊 匹配&#xff09; (2) regexp_instr &#xff1a;同 instr 功能相似&#xff08;返回字符所在 下标&#xff09; (3) regexp_substr &#xff1a; 同 substr 功能相似&…

虚拟网络设备与Linux网络协议栈

在现代计算环境中&#xff0c;虚拟网络设备在实现灵活的网络配置和隔离方面发挥了至关重要的作用&#x1f527;&#xff0c;特别是在容器化和虚拟化技术广泛应用的今天&#x1f310;。而Linux网络协议栈则是操作系统处理网络通信的核心&#x1f4bb;&#xff0c;它支持广泛的协…

点击上传文件

一、页面样式&#xff1a; &#xff08;1&#xff09;点击前&#xff1a; &#xff08;2&#xff09;点击后&#xff1a; 设计&#xff1a;①自定义elementPlus图标&#xff1b;②使用Tooltip实现鼠标悬浮按钮上出现文字提示&#xff1b;③上传与更换的切换样式&#xff1b;…