CGAL的交叉编译-androidlinux-arm64

由于项目算法需要从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文库

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

政安晨:【Keras机器学习实践要点】(二十二)—— 基于 TPU 的肺炎分类

目录 简述 介绍 / 布置 加载数据 可视化数据集 建立 CNN 纠正数据失衡 训练模型 拟合模型 可视化模型性能 ​编辑预测和评估结果 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客…

达梦(DM)报错[-3209]: 无效的存储参数

[TOC](达梦(DM)报错[-3209]: 无效的存储参数) 最近有一个项目&#xff0c;一直使用的是达梦数据库&#xff0c;今天遇到了一个问题&#xff0c;就是将测试环境新增加的表导入线上时报错 [-3209]: 无效的存储参数&#xff0c;这里我用我本地的达梦数据库复现一下这个问题&#…

【HTML】简单制作一个动态变色光束花

目录 前言 开始 HTML部分 效果图 ​编辑​编辑​编辑​编辑总结 前言 无需多言&#xff0c;本文将详细介绍一段代码&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建一个文本文档&#xff0c;其中HTML的文件名改为[index.html]&a…

python-flask后端知识点

anki 简单介绍&#xff1a; 在当今信息爆炸的时代&#xff0c;学习已经不再仅仅是获取知识&#xff0c;更是一项关于有效性和持续性的挑战。幸运的是&#xff0c;我们有幸生活在一个科技日新月异的时代&#xff0c;而ANKI&#xff08;Anki&#xff09;正是一款旗舰级的学习工具…

【深度学习】环境搭建ubuntu22.04

清华官网的conda源 https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ 安装torch conda install pytorch torchvision torchaudio pytorch-cuda12.1 -c pytorch -c nvidia 2.2.2 conda install 指引看这里&#xff1a; ref:https://docs.nvidia.com/cuda/cuda-installatio…

高创新 | Matlab实现OOA-CNN-GRU-Attention鱼鹰算法优化卷积门控循环单元注意力机制多变量回归预测

高创新 | Matlab实现OOA-CNN-GRU-Attention鱼鹰算法优化卷积门控循环单元注意力机制多变量回归预测 目录 高创新 | Matlab实现OOA-CNN-GRU-Attention鱼鹰算法优化卷积门控循环单元注意力机制多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现OOA…

css实现各级标题自动编号

本文在博客同步发布&#xff0c;您也可以在这里看到最新的文章 Markdown编辑器大多不会提供分级标题的自动编号功能&#xff0c;但我们可以通过简单的css样式设置实现。 本文介绍了使用css实现各级标题自动编号的方法&#xff0c;本方法同样适用于typora编辑器和wordpress主题…

Qt案例 通过调用Setupapi.h库实现对设备管理器中设备默认驱动的备份

参考腾讯电脑管家-软件市场中的驱动备份专家写的一个驱动备份软件案例&#xff0c;学习Setupapi.h库中的函数使用.通过Setupapi.h库读取设备管理器中安装的设备获取安装的驱动列表&#xff0c;通过bit7z库备份驱动目录下的所有文件. 目录导读 实现效果相关内容示例获取SP_DRVIN…

计算机网络-运输层

运输层 湖科大计算机网络 参考笔记&#xff0c;如有侵权联系删除 概述 运输层的任务&#xff1a;如何为运行在不同主机上的应用进程提供直接的通信服务 运输层协议又称端到端协议 运输层使应用进程看见的好像是在两个运输层实体之间有一条端到端的逻辑通信信道 运输层为应…

Github上传大文件(>25MB)教程

0.在github中创建新的项目&#xff08;已创建可忽略这一步&#xff09; 如上图所示&#xff0c;点击New repository 进入如下页面&#xff1a; 1.下载Git LFS 下载git 2.打开gitbash 3.上传文件&#xff0c;代码如下: cd upload #进入名为upload的文件夹&#xff0c;提前…

k8s集群node节点状态为Not Ready

目录 一、Node节点Not Ready状态的可能原因 二、排查node节点状态为Not Ready的原因 一、Node节点Not Ready状态的可能原因 node节点状态为Not Ready可能的原因有&#xff1a; 1.网络插件出问题 有过安装经验的小伙伴应该很熟悉未安装网络插件的情况下node节点在集群中的状…

【MacOs】proxychains配置使用

一、开始 1. 安装proxychains 使用brew进行安装 brew install proxychains-ng没有homebrew的&#xff0c;可以使用该命令安装 /usr/bin/ruby -e "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install)"2. 配置代理配置文件 cd /opt/homeb…

AUTOSAR配置工具开发教程 - 开篇

简介 本系列的教程&#xff0c;主要讲述如何自己开发一套简单的AUTOSAR ECU配置工具。适用于有C# WPF基础的人员。 简易介绍见&#xff1a;如何打造AUTOSAR工具_autosar_mod_ecuconfigurationparameters-CSDN博客 实现版本 AUTOSAR 4.0.3AUTOSAR 4.2.2AUTOSAR 4.4.0 效果 …

麻雀优化算法(Sparrow Search Algorithm)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 算法背景 麻雀算法&#xff08;Sparrow Search Algorithm, SSA&#xff09;是一种受自然界麻雀群体行为启发的优化算法。想象一下&#xff0c;一…

Linux学习-网络UDP

网络 数据传输,数据共享 网络协议模型 OSI协议模型 应用层 实际发送的数据 表示层 发送的数据是否加密 会话层 是否建立会话连接 传输层 数据传输的方式&#xff08;数据报、流式&#…

esp32上PWM呼吸灯

1、什么是pwm PWM&#xff08;Pulse Width Modulation&#xff09;简称脉宽调制&#xff0c;是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术&#xff0c;广泛应用在测量、通信、工控等方面。 1.1频率 单位时间内PWM方波重复的次数 1.2占空比 一个周期内…

HarmonyOS 应用开发-根据icon自适应背景颜色

介绍 本示例将介绍如何根据图片设置自适应的背景色。 效果图预览 使用说明 转换图片为PixelMap&#xff0c;取出所有像素值遍历所有像素值&#xff0c;查找到出现次数最多的像素&#xff0c;即为图片的主要颜色适当修改图片的主要颜色&#xff0c;作为自适应的背景色 实现思…

云岚到家项目

一.项目介绍 云岚到家项目是一个家政服务o2o平台&#xff0c;互联网家政是继打车、外卖后的又一个风口&#xff0c;创业者众多&#xff0c;比如&#xff1a;58到家&#xff0c;天鹅到家等&#xff0c;o2o&#xff08;Online To Offline&#xff09;是将线下商务的机会与互联网…

负荷预测 | Matlab基于TCN-BiGRU-Attention单输入单输出时间序列多步预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于TCN-BiGRU-Attention单输入单输出时间序列多步预测&#xff1b; 2.单变量时间序列数据集&#xff0c;采用前12个时刻预测未来96个时刻的数据&#xff1b; 3.excel数据方便替换&#xff0c;运行环境matlab…

高端大气自适应全屏酷炫渐变卡片html源码图片切换特效html5源码导航引导网站源码

源码特点&#xff1a; 1&#xff1a;手工书写DIVCSS、代码精简无冗余。 2&#xff1a;自适应结构&#xff0c;全球先进技术&#xff0c;高端视觉体验。 3&#xff1a;SEO框架布局&#xff0c;栏目及文章页均可独立设置标题/关键词/描述。 4&#xff1a;附带测试数据、安装教程、…