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

news2024/12/23 20:13:17

初级代码游戏的专栏介绍与文章目录-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 install

git库源码编译:
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.com
        TLS:           __thread
        SIGSEGV:       altstack
        Notifications: epoll
        Architecture:  amd64
        Disabled:      none
        Misc:          softdebug
        Interpreter:   yes
        LLVM:          supported, not enabled.
        Suspend:       hybrid
        GC:            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.com
        TLS:           __thread
        SIGSEGV:       normal
        Notifications: epoll
        Architecture:  arm64
        Disabled:      none
        Misc:          softdebug
        Interpreter:   yes
        LLVM:          supported, not enabled.
        Suspend:       preemptive
        GC:            sgen (concurrent by default)
root@ubuntu:~#

(这里是文档结束)

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

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

相关文章

有道在线翻译外,这三款翻译工具值得一试!

在众多翻译工具中,有道在线翻译是很多小伙伴都会用的。而市场上当然也有很多好用的翻译工具,这里就来给大家介绍几个! 福昕在线翻译 直达链接: fanyi.pdf365.cn/ 操作教程:立即获取 这也是一款在线翻译工具。它以…

解决 VScode 每次打开都是上次打开的文件问题

每次使用 VScode 打开总是上次的文件,可以简单设置即可,记录一下。 VScode Visual Studio Code(简称VSCode)是一个由微软开发的免费、开源的代码编辑器。它支持多种编程语言,并提供了代码高亮、智能代码补全、代码重构…

【分布式知识】分布式对象存储组件-Minio

文章目录 什么是minio核心特点:使用场景:开发者工具:社区和支持: 核心概念什么是对象存储?MinIO 如何确定对对象的访问权限?我可以在存储桶内按文件夹结构组织对象吗?如何备份和恢复 MinIO 上的…

【力扣 + 牛客 | SQL题 | 每日4题】牛客大厂笔试真题SQLW6, W7, W8

1. 牛客大厂笔试真题SQLW6:统计所有课程参加培训人次 1.1 题目: 描述 某公司员工培训信息数据如下: 员工培训信息表cultivate_tb(info_id-信息id,staff_id-员工id,course-培训课程),如下所示: 注:该公…

不依赖F8键,如何快速进入电脑安全模式

如果不希望通过狂按F8键进入安全模式,可以尝试以下几种方法来进入电脑的安全模式: 方法一:使用Ctrl键 关闭电脑并重新启动。在电脑启动过程中,按下Ctrl键(需要在Windows系统启动画面出现之前就开始按)。当…

基于Django+Python的房屋信息可视化及价格预测系统设计与实现(带文档)

项目运行 需要先安装Python的相关依赖:pymysql,Django3.2.8,pillow 使用pip install 安装 第一步:创建数据库 第二步:执行SQL语句,.sql文件,运行该文件中的SQL语句 第三步:修改源…

Linux: network: wireshark IO图的一个问题

今天遇到一个问题,发现wireshark画的IO图,前几秒没有数据,但是根据Raw的pcap看,是有包的,这就迷惑了。 经同事提醒,这个IO在设置了多个画图filter的时候,可能导致开始前几秒没有输出。如下图 这…

Java中Thread类的基本认识与使用(如果想知道Java中有关Thread类的基本知识,那么只看这一篇就足够了!)

前言:在Java中,Thread类是实现多线程编程的核心。它允许程序同时执行多个任务,提高应用程序的响应能力和性能。通过Thread类,开发者可以轻松创建和管理线程,并实现复杂的并发操作。接下来,我们将探讨Thread…

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

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

机器人转人工时,开启实时质检(mod_cti基于FreeSWITCH)

文章目录 前言联系我们实现步骤1. 修改拨号方案2. 启用拨号方案 前言 在客户与机器人对话中,是不能开启质检功能的。因为机器人识别会与质检识别产生冲突。如果用户想通过机器人转接到人工时,开启质检功能,记录客户与人工之间的对话。应该如…

《a16z : 2024 年加密货币现状报告》解析

加密社 原文链接:State of Crypto 2024 - a16z crypto译者:AI翻译官,校对:翻译小组 当我们两年前第一次发布年度加密状态报告的时候,情况跟现在很不一样。那时候,加密货币还没成为政策制定者关心的大事。 比…

Python Numpy 实现神经网络自动训练:反向传播与激活函数的应用详解

Python Numpy 实现神经网络自动训练:反向传播与激活函数的应用详解 这篇文章介绍了如何使用 Python 的 Numpy 库来实现神经网络的自动训练,重点展示了反向传播算法和激活函数的应用。反向传播是神经网络训练的核心,能够通过计算梯度来优化模…

unity项目导出安卓工程后,在AndroidStudio打包报错:unityLibrary:BuildIl2CppTask‘.

下面这个是我在unity开发者社区提问后,他们回答得: 解决方案:我这边按照这几个方案检查了下,NDK和JDK都没问题,最后重启电脑才解决的,应该是文件被锁定了,我用的windows系统的。 验证&#xff…

达梦数据守护集群_备库重建(二)

目录 1、概述 1.1 实验场景 1.2 实验环境 2、故障模拟 3、重建方案1 3.1 登录主库、联机备份 3.2 脱机还原备库 3.3 模拟新业务数据 3.4 主库备份归档 3.5 利用归档恢复备库 3.6 启动备库 3.7 验证 4、重建方案2 4.1 登录主库、联机备份 4.2 脱机还原备库 4.3 …

是否有必要考PG认证?

如今PG很火,我在BOSS招聘查了一下,确实很多职位需要PG.那么考个PG认证确实很有必要! 当然这么快给出肯定答案,这公众号是发不出来的.必须有300个字才可以哦! 大家友情支持下,点点广告! 听我来细说 1.2.3 本小仙40有余可以说是80后.我们这代80后什么好事都没捞着,糟糕的事没有…

基于docker 部署redis

1、拉取镜像 docker pull redis:latest如果拉取失败可以尝试下配置镜像源,具体参考如下,目前暂可以使用 Docker切换镜像源-CSDN博客 2、创建配置文件 mkdir /usr/local/redis/conf vim redis.conf bind 0.0.0.0#protected-mode no port 6379 tcp-b…

用更多的钱买电脑而不是手机

如果,我们对自己的定义是知识工作者,那么在工作、学习相关的电子设备投入上,真的别舍不得花钱。 需要留意的是,手机,对于大部分在电脑前工作的人,不是工作设备。在我看来,每年投入到电脑的钱&…

前端经典【面试题】持续更新HTML、CSS、JS、VUE、FLUTTER、性能优化等

HTML/CSS 面试题 什么是语义化 HTML&#xff1f; 说明&#xff1a;语义化 HTML 使用 HTML 标签来描述内容的含义&#xff0c;而不仅仅是其外观。使用语义化标签可以提高可读性和可访问性&#xff0c;并对 SEO 友好。示例&#xff1a; <header><h1>网站标题</h1&…

基于C#开发游戏辅助工具的Windows底层相关方法详解

开发游戏辅助工具通常需要深入了解Windows操作系统的底层机制&#xff0c;以及如何与游戏进程进行有效交互。本文将基于C#语言&#xff0c;从Windows底层方法的角度来详细讲解开发游戏辅助工具的相关技术和概念。 一、游戏辅助工具的基本概述 游戏辅助工具&#xff0c;通常被称…

Java应用程序的测试覆盖率之设计与实现(三)-- jacoco cli 客户端

一、背景 上文已把覆盖率数据采集好了,并提供远程连接的tcp地址及端口。 jacoco cli文档jacoco cli jar包jacococli.jar 我下载好了,放在github工程里。 本文主要是介绍如何使用jacoco cli 客户端读取并生成覆盖率报告。 二、使用 1、dump覆盖率统计 java -jar doc/jacoc…