mono源码交叉编译 linux arm arm64全过程

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。

源码指引:github源码指引_初级代码游戏的博客-CSDN博客


        坑多。

目录

一、源码下载

二、为什么要下载整个库

坑,如果子模块更新失败

三、上传到ubuntu18.04虚拟机

坑,修改sh权限

四、执行sutogen.sh

五、验证结果

六、交叉编译arm arm64

坑,找不到头文件atomic_ops.h

七、验证结果


一、源码下载

        上git下载源码,GitHub - mono/mono: Mono open source ECMA CLI, C# and .NET implementation.

        我下载了整个库,由于编译版本包遇到问题,后面的操作都是基于版本库的。

        官方编译说明在(链接来自README.md) https://www.mono-project.com/docs/compiling-mono/linux/

        下面是官方说明的重点:

压缩包编译:
PREFIX=/usr/local
VERSION=4.2.1
tar xvf mono-$VERSION.tar.xz
cd mono-$VERSION
./configure --prefix=$PREFIX
make
make installgit库源码编译:
PATH=$PREFIX/bin:$PATH
git clone https://github.com/mono/mono.git
cd mono
./autogen.sh --prefix=$PREFIX
make
make install

二、为什么要下载整个库

        下载了版本包(tag那里)编译时发现不停地即时下载子模块,由于网络原因(大家都懂吧),这个行为的结果是不确定的,所以放弃了,改为克隆整个库,先在本地获取完整代码。

        然后更新子模块,子模块会放在external目录下(注意,我用的是tortoisegit,在mono根目录下更新子模块,如果在子模块目录下更新子模块则是更新子模块的子模块,而且确实存在子模块的子模块!)。

        有三个子模块也有子模块:api-doc-tools、bdwgc、linker。

        确保全部子模块和子模块的子模块更新成功。

坑,如果子模块更新失败

        删除子模块的目录,再次更新。我希望这只是我用的tortoisegit的问题。

三、上传到ubuntu18.04虚拟机

        整个库接近5G大小。

        ftp上传需要改sh文件的权限。

坑,修改sh权限

        最开始当然要修改autogen.sh的权限,但是执行会报错,逐步操作下来最终需要这么多权限:

chmod 755 autogen.sh scripts/*.sh external/bdwgc/autogen.sh

        所有操作都在源码树的根目录下进行。源码树里面有个叫“mono”的目录,整个库直接下过来默认也是mono目录,所以可能有两级mono目录。

四、执行sutogen.sh

        命令:

./autogen.sh --prefix=安装目录

        执行过程仍然不太顺利,下面是记录:

提示:mv: cannot stat 't-es.gmo': No such file or directory
解决:	apt-get install gettext 这个不一定需要在po/mcs目录下创建空文件 t-de.gmo t-es.gmo t-ja.gmo t-pt_BR.gmo
chmod 755 mono/tests/*.sh
子模块corefx是空的,删除重新更新子模块后有文件了,还有一些空的,全部删了重来
chmod 755 mcs/build/start-compiler-server.sh

        创建了几个空文件,又给几个sh增加了权限。

        最终编译完成,执行make install安装到指定的目录。

五、验证结果

        进到安装后的目录的bin下面,执行mono:

user@vm-ubuntu:~/mono/mono_install_x64/bin$ mono --version
Mono JIT compiler version 6.13.0 (main/0f53e9e151d Mon Oct 21 06:10:39 UTC 2024)
Copyright (C) Novell, Inc, Xamarin Inc and Contributors. www.mono-project.comTLS:           __threadSIGSEGV:       altstackNotifications: epollArchitecture:  amd64Disabled:      noneMisc:          softdebugInterpreter:   yesLLVM:          supported, not enabled.Suspend:       hybridGC:            sgen (concurrent by default)
user@vm-ubuntu:~/mono/mono_install_x64/bin$

        显示版本是6.13。

六、交叉编译arm arm64

        还在之前源码基础上编译,make clean清理掉。似乎不clean可能带来一些问题,每次重新搞之前做一下吧。

        这个坑就更多了,但是麻烦都在编译环境上。我用的一个特定工具链里面很多写死的路径,跟我的安装路径不一致,一个一个修改了很久,最后放弃修改,按照写死的路径重建了工具链。

        解决了工具链自身的问题,剩下的就是参数。之前我们没有使用--host参数,交叉编译必须使用--host指定目标,这个目标其实就是工具链的文件名前缀,检查一下工具链目录就知道了。

        因为一开始总是编译不过去,我试了很多工具链,包括developer.arm.com上下载的官方工具链的几个不同的版本。标准工具链的版本7(和附近的几个版本)的命名规则里面缺少“OS”部分,导致无法识别,高版本就没问题。

        我下载的几个是这样的:

        看得出来早期版本命名方式明显不同。我为什么特别选择了版本7呢?是因为本地编译的gcc版本是7,交叉编译有问题就怀疑是版本不对,不过最终是用13.3编译成功的,所以7-13应该都是没问题的。

        交叉编译用的参数:

./autogen.sh --prefix=安装目录 --host=arm-none-linux-gnueabihf

         --host要根据实际的工具链修改,标准工具13.3的bin目录下是这样的:

        一看就明白了吧。

        然后make就行了。

坑,找不到头文件atomic_ops.h

        怎么可能顺顺利利呢。

报错:
./include/private/gc_atomic_ops.h:105:11: fatal error: atomic_ops.h: No such file or directory
参见https://github.com/mono/mono/issues/20299
缺少头文件包含路径,make增加CFLAGS参数即可解决

         坑好大,解决了就容易了:

make V=1 CFLAGS="-I/home/user/mono/external/bdwgc/libatomic_ops/src/ -I/home/user/mono/mono/eglib/"

        参数V=1用来输出编译指令,默认是不输出的,不方便差错。

        增加的头文件包含路径要根据自己需要修改,我的源码树的根目录是“/home/user/mono”,注意源码树里面有个子目录也叫mono。

        然后用标准工具链13.3编译arm32成功、用一个专用工具链编译arm64成功。

七、验证结果

        用file检查文件类型,类似“ELF 64-bit LSB shared object, ARM aarch64”这样。

        上传到设备,检查版本:

root@ubuntu:~# mono_install_arm64/bin/mono --version
Mono JIT compiler version 6.13.0 (main/0f53e9e151d Tue Oct 22 07:29:06 UTC 2024)
Copyright (C) Novell, Inc, Xamarin Inc and Contributors. www.mono-project.comTLS:           __threadSIGSEGV:       normalNotifications: epollArchitecture:  arm64Disabled:      noneMisc:          softdebugInterpreter:   yesLLVM:          supported, not enabled.Suspend:       preemptiveGC:            sgen (concurrent by default)
root@ubuntu:~#

(这里是文档结束)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql——事务详解

一、事务定义 事务:事务是一个最小的不可在分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务是一个最小的工作单元)事务保证多条sql语句要么同时执行成功,要么同时执行失败一个完整的业务需要批量的DML…

移除Microsoft Edge浏览器“由你的组织管理“提示的方法

背景: 点击Microsoft Edge浏览器右上角的按钮有时候会出现提示“由你的组织管理”。但实际上自己的电脑并没有被公司或其他企业管理。 解决方案: 提示:修改注册表如果操作不当会影响电脑,请提前备份注册表!&#xff…

Java 开发——(上篇)从零开始搭建后端基础项目 Spring Boot 3 + MybatisPlus

一、概述 记录时间 [2024-10-23] 本文是一个基于 Spring Boot 3 MybatisPlus 的项目实战开发,主要涵盖以下几个方面: 从零开始的项目创建IDEA 中开发环境的热部署Maven、Swagger3、MybatisPlus 等的配置路由映射知识静态资源访问文件上传功能实现拦截器…

Qt之QCamera的简单使用

文章目录 一、相机操作相关示例1.摄像头操作内容使用示例2.摄像头信息展示使用示例3.摄像头设置切换、预览操作示例 二、相机使用个人操作理解1.相机类支持信息获取2.相机类曝光、焦点、图像处理控制信息获取3.快速启动相机设置(各个设备处于理想状态) 三…

地平线x5下运行yolo11s-seg模型

经过地瓜机器人工作人员(感谢吴超同学)的及时技术支持,整体比较顺利的跑起来了yolo11s-seg分割模型。将一些经验记录下来: 首先下载使用docker镜像: https://developer.d-robotics.cc/forumDetail/228559182180396619 …

linux驱动—注册总线分析

成功地在直接注册了一个总线,并且在总线目录下创建了属性文件,什么会在 sys/bus 目录下生成 mybus,目录以及对应的 devices,drivers, drivers_autoprobe,drivers_probe,uevent目录和属性呢? /sys,目录下的目录都对应一个kobject,…

如何成为录屏高手?2024年全新录屏工具梳理,你选对了吗?

如何录屏?录屏现在对我们来说太重要了,不管是做教学视频、演示文稿,还是录游戏或者教别人怎么用软件,都离不开录屏工具。但是市面上录屏软件一大堆,挑个适合自己的真不容易。今天,我就来给你介绍几款特别火…

知识图谱解码:AI 如何构建知识网络

大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 AI工具集1:大厂AI工具【共23款…

凸轮应用实例(带进料装置的伺服压机控制)

凸轮表凸轮关系曲线建立 博途S7-1500T PLC曲柄连杆模型仿真(电子凸轮完整配置+SCL源代码)-CSDN博客文章浏览阅读4次。这篇博客介绍了曲柄连杆机构的位移与曲柄转动角度关系,通过MATLAB进行计算和Simulink验证,并提供博途SCL源代码。文章链接提供了详细的曲柄连杆数学模型分析…

分布式理论基础

文章目录 1、理论基础2、CAP定理1_一致性2_可用性3_分区容错性4_总结 3、BASE理论1_Basically Available(基本可用)2_Soft State(软状态)3_Eventually Consistent(最终一致性)4_总结 1、理论基础 在计算机…

WASM 使用说明23事(RUST实现)

文章目录 1. wasm是什么1.1 chatgpt定义如下:1.2 wasm关键特性: 2. wasm demo2.1 cargo 创建项目2.2 编写code2.3 安装wasm-pack2.4 编译 3.1 html页面引用wasm代码(js引用)3.2 访问页面4 导入js function4.1 编写lib.rs文件,内容…

【SpringCloud】06-Sentinel

1. 雪崩问题 一个微服务出现问题导致一系列微服务都不可以正常工作。 服务保护方案: 请求限流。线程隔离。 服务熔断 2. Sentinel 启动Sentinel java -Dserver.port8090 -Dcsp.sentinel.dashboard.serverlocalhost:8090 -Dproject.namesentinel-dashboard -ja…

【已解决】C# NPOI如何在Excel文本中增加下拉框

前言 上图&#xff01; 解决方法 直接上代码&#xff01;&#xff01;&#xff01;&#xff01;综合了各个大佬的自己修改了一下&#xff01;可以直接规定在任意单元格进行设置。 核心代码方法块 #region Excel增加下拉框/// <summary>/// 增加下拉框选项/// </s…

centeros7 编译ffmpeg

使用yum安装的路似乎已经堵住了&#xff0c;请求的镜像全是404或503 1.打开终端并使用yum安装EPEL存储库(Extra Packages for Enterprise Linux)&#xff1a;sudo yum install epel-release2.接下来&#xff0c;使用以下命令来安装FFmpeg&#xff1a;sudo yum install ffmpeg …

有关spring,springboot项目的知识点

文章目录 1.Spring基本介绍1.1Spring官网1.2Spring的发展 2.SpringBoot2.1SpringBoot快速入门2.1.1创建SpringBoot工程,并勾选web开发相关依赖2.1.2定义HelloController类,并添加方法helllo,且添加注解2.1.3运行测试 3.HTTP协议3.1HTTP协议的概念3.1.1HTTP的特点 3.2HTTP-请求协…

YOLOv8_ ByteTrack目标跟踪、模型部署

YOLOv8目前支持BoT-SORT和ByteTrack两种多目标跟踪算法&#xff0c;默认的目标跟踪算法为BoT-SORT 如果要使用ByteTrack跟踪算法&#xff0c;可以添加命令行参数trackerbytetrack.yaml 一、 VisDrone2019数据集 VisDrone&#xff1a;无人机目标检测和追踪基准数据集。&#x…

《云原生安全攻防》-- K8s攻击案例:权限维持的攻击手法

在本节课程中&#xff0c;我们将一起深入了解K8s权限维持的攻击手法&#xff0c;通过研究这些攻击手法的技术细节&#xff0c;来更好地认识K8s权限维持所带来的安全风险。 在这个课程中&#xff0c;我们将学习以下内容&#xff1a; K8s权限维持&#xff1a;简单介绍K8s权限维持…

【大模型理论篇】主流大模型的分词器选择及讨论(BPE/BBPE/WordPiece/Unigram)

1. 背景分析 分词是将输入和输出文本拆分成更小单位的过程&#xff0c;使得大模型能够处理。token可以是单词、字符、子词或符号&#xff0c;取决于模型的类型和大小。分词可以帮助模型处理不同的语言、词汇和格式&#xff0c;并降低计算和内存成本。分词还可以通过影响token的…

10-1.idea中的项目结构,辅助快捷键,模块的操作

idea中的项目结构和辅助快捷键 IDEA中项目结构 首先是创建项目&#xff0c;新建的项目中有子项目&#xff0c;我们可以创建模块 然后在模块中我们可以创建包&#xff0c;在包中的SRC中写我们的源代码&#xff0c;也就是类。 VScode写Java项目 如何你电脑比较卡的话&#…

Java中自增自减,赋值,逻辑,三元运算符

自增自减运算符 在某个变量前面或者后面加一--在某个变量前面或者后面减一 可以看见&#xff0c;当a输出时&#xff0c;a是没有变化的&#xff0c;说明如果是在变量后就是先使用再增加&#xff0c;而b输出时&#xff0c;b增加了1&#xff0c;说明如果是在变量前面就是先增加再…