当前位置: 首页 > news >正文

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:~#

(这里是文档结束)

相关文章:

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

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...

矩阵的可解性:关于Ax=b的研究

上一篇文章讲解了如何求解 A x 0 Ax0 Ax0,得到 A A A的零空间。 类似的,我们今天学习的是如何求解 A x b Axb Axb,并以此加强你对线性代数中,代数与空间的理解。 同样的,我们举与上一次一样的例子,矩阵 …...

10.22.2024刷华为OD C题型(三)--for循环例子

脚踝动了手术,现在宾馆恢复,伤筋动骨一百天还真不是说笑的,继续努力吧。 文章目录 靠谱的车灰度图恢复灰度图恢复 -- for循环使用例子 靠谱的车 https://www.nowcoder.com/discuss/564514429228834816 这个题目思路不难,就是要自…...

QT:MaintenanceTool 模块安装工具

QT的MaintenanceTool 工具对已安装的 Qt 进行卸载、修复等其他操作时提示At least one valid and enabled repository required for this action to succeed 解决方式:在设置中添加一个临时的仓库 https://mirrors.tuna.tsinghua.edu.cn/qt/online/qtsdkrepositor…...

同标签实现监听LocalStorage

使用 React 生命周期函数 useEffect来监听和处理 LocalStorage 的变化 import React, { useEffect } from react;const LocalStorageListener () > {useEffect(() > {// 注册监听器const handleStorageChange (event) > {if (event.key myKey) {console.log(注册…...

JAVA高性能缓存项目

版本一 代码实现 import java.util.HashMap; import java.util.concurrent.TimeUnit;public class CacheExample01 {private final static HashMap<String, Integer> cache new HashMap<>();public static Integer check(String userId) throws InterruptedExce…...

智慧农业大数据平台:智汇田园,数驭未来

智慧农业大数据平台 计讯物联智慧农业大数据平台是一个集管理数字化、作业自动化、生产智能化、产品绿色化、环境信息化、服务现代化于一体的多功能监管系统。它通过与硬件产品的搭配使用&#xff0c;实现对农业生产全过程的实时监测、精准控制和科学管理。该平台集成了多个数…...

Go语言基础教程:可变参数函数

Go 语言允许函数接收可变数量的参数&#xff0c;这种特性对于处理数量不确定的参数特别有用。在本教程中&#xff0c;我们将通过示例代码讲解如何定义和使用 Go 的可变参数函数。 package mainimport "fmt"// 定义一个可变参数函数 sum&#xff0c;接收任意数量的整…...

高并发场景下解决并发数据不一致

简单的场景: 全量数据更新的情况下, 不在乎同一秒的请求都必须要成功, 只留下最新的更新请求数据 方案常用的是 1、数据库增加时间戳标识实现的乐观锁, 请求参数从源头带上微秒或者毫秒时间戳数据库存储, 然后在更新SQL语句上比较 (数据库的时间 < 参数传递的时间) 例如: A…...

OpenAI GPT-o1实现方案记录与梳理

本篇文章用于记录从各处收集到的o1复现方案的推测以及介绍 目录 Journey Learning - 上海交通大学NYUMBZUAIGAIRCore IdeaKey QuestionsKey TechnologiesTrainingInference A Tutorial on LLM Reasoning: Relevant methods behind ChatGPT o1 - UCL汪军教授Core Idea先导自回归…...

Excel:vba实现生成随机数

Sub 生成随机数字()Dim randomNumber As IntegerDim minValue As IntegerDim maxValue As Integer 设置随机数的范围(假入班级里面有43个学生&#xff0c;学号是从1→43)minValue 1maxValue 43 生成随机数(在1到43之间生成随机数)randomNumber Application.WorksheetFunctio…...

Python | Leetcode Python题解之第506题相对名次

题目&#xff1a; 题解&#xff1a; class Solution:desc ("Gold Medal", "Silver Medal", "Bronze Medal")def findRelativeRanks(self, score: List[int]) -> List[str]:ans [""] * len(score)arr sorted(enumerate(score), …...

安全见闻(6)

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址&#xff1a;安全见闻&#xff08;6&#xff09;_哔哩哔哩_bilibili 学无止境&#xff0c;开拓自己的眼界才能走的更远 本文主要讲解通讯协议涉及的安全问题。…...

Promise、async、await 、异步生成器的错误处理方案

1、Promise.all 的错误处理 Promise.all 方法接受一个 Promise 数组&#xff0c;并返回所有解析 Promise 的结果数组&#xff1a; const promise1 Promise.resolve("one"); const promise2 Promise.resolve("two");Promise.all([promise1, promise2]).…...

腾讯云:数智教育专场-学习笔记

15点13分2024年10月21日&#xff08;短短5天的时间&#xff0c;自己的成长速度更加惊人&#xff09;-开始进行“降本增效”学习模式&#xff0c;根据小米手环对于自己的行为模式分析&#xff08;不断地寻找数据之间的关联性&#xff09;&#xff0c;每天高效记忆时间&#xff0…...

Ovis: 多模态大语言模型的结构化嵌入对齐

论文题目&#xff1a;Ovis: Structural Embedding Alignment for Multimodal Large Language Model 论文地址&#xff1a;https://arxiv.org/pdf/2405.20797 github地址&#xff1a;https://github.com/AIDC-AI/Ovis/?tabreadme-ov-file 今天&#xff0c;我将分享一项重要的研…...

python的Django的render_to_string函数和render函数模板的使用

一、render_to_string render_to_string 是 Django 框架中的一个便捷函数&#xff0c;用于将模板渲染为字符串。 render_to_string(template_name.html, context, requestNone, usingNone) template_name.html&#xff1a;要渲染的模板文件的名称。context&#xff1a;传递给…...

基于Python大数据的王者荣耀战队数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

【Linux学习】(3)Linux的基本指令操作

前言 配置Xshell登录远程服务器Linux的基本指令——man、cp、mv、alias&which、cat&more&less、head&tail、date、cal、find、grep、zip&tar、bc、unameLinux常用热键 一、配置Xshell登录远程服务器 以前我们登录使用指令&#xff1a; ssh 用户名你的公网…...

Mac 使用脚本批量导入 Apple 歌曲

最近呢&#xff0c;买了一个 iPad&#xff0c;虽然家里笔记本台式都有&#xff0c;显示器都是 2个&#xff0c;比较方便看代码&#xff08;边打游戏边追剧&#xff09;。 但是在床上拿笔记本始终还是不方便&#xff0c;手机在家看还是小了点&#xff0c;自从有 iPad 之后&…...

网络安全入门:2026年转行网络安全完整路径图

网络安全入门&#xff1a;2026 年转行网络安全完整路径图 导语&#xff1a;2026 年&#xff0c;网络安全人才缺口达 150 万&#xff0c;平均薪资较传统 IT 岗位高出 30%。但 70% 的转行者因路径不清晰而失败。本文详解 2026 年转行网络安全的完整路径&#xff1a;学习路线、证…...

基于多平台行为数据构建AI Agent深度用户画像:Know Your Owner项目解析

1. 项目概述&#xff1a;从“你是谁”到“我懂你”的智能跨越在AI助手日益普及的今天&#xff0c;我们面临着一个核心矛盾&#xff1a;用户期望获得高度个性化的服务&#xff0c;而AI助手在初次接触时却对用户一无所知。传统的解决方案&#xff0c;比如让用户填写冗长的问卷&am…...

构建个人知识管理系统:基于技能树与间隔重复的学习框架

1. 项目概述&#xff1a;构建个人专属的“人类技能树” 最近在折腾一个挺有意思的项目&#xff0c;我把它叫做“人类技能树”。这名字听起来有点科幻&#xff0c;但内核其实很朴素&#xff1a;我们每个人从小到大&#xff0c;从学校到职场&#xff0c;都在不断地学习各种技能&a…...

独立开发者如何借助taotoken模型广场低成本验证产品创意

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 独立开发者如何借助Taotoken模型广场低成本验证产品创意 对于资源有限的独立开发者或小型工作室而言&#xff0c;验证一个需要AI功…...

为什么92%的DeepSeek私有化部署在K8s上遭遇OOMKilled?——GPU内存隔离、vLLM适配与cgroups v2调优三重解法

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;DeepSeek私有化部署的Kubernetes现状与OOMKilled困局 当前&#xff0c;DeepSeek系列大模型在企业私有化场景中广泛采用Kubernetes进行容器化编排部署。然而&#xff0c;实际落地过程中&#xff0c;内存…...

氛围编程实战:用AI工具栈快速构建可部署应用

1. 项目概述&#xff1a;什么是“氛围编程”&#xff1f;如果你对“氛围编程”这个词感到陌生&#xff0c;或者觉得它听起来有点玄乎&#xff0c;那太正常了。我第一次听到时&#xff0c;也以为又是哪个硅谷弄潮儿发明的新潮黑话。但当我真正开始实践&#xff0c;并在几个月内从…...

别再只盯着VGA线了!手把手教你用示波器看懂RGBHV时序图(附绿同步电路分析)

数字示波器实战&#xff1a;解码RGBHV信号与绿同步电路设计全指南 在复古游戏机改造、CRT显示器维修或视频转换板设计的场景中&#xff0c;RGBHV信号的理解与测量往往是硬件工程师和电子爱好者面临的第一道技术门槛。不同于现代数字接口的标准化协议&#xff0c;模拟视频信号时…...

Taotoken官方价折扣活动对于高频用户的实际成本影响分析

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken官方价折扣活动对于高频用户的实际成本影响分析 1. 理解Taotoken的计费模式 Taotoken平台采用按Token消耗量计费的模式。…...

深入浅出MCP:从零开始的完整学习指南(保姆级教程)

手把手带你理解MCP是什么、怎么用、如何开发&#xff0c;每个步骤都有详细说明 写在前面 很多朋友看完MCP的介绍还是一头雾水&#xff1a;“这到底是什么&#xff1f;跟我有什么关系&#xff1f;我该怎么用&#xff1f;” 别急&#xff0c;这篇文章我会用最通俗的方式&#x…...

从Arrays.fill()到Stream API:Java二维数组初始化的几种高效写法与性能对比

从Arrays.fill()到Stream API&#xff1a;Java二维数组初始化的几种高效写法与性能对比 在算法竞赛和数据处理应用中&#xff0c;二维数组的初始化往往是性能优化的第一个瓶颈。我曾在一个图像处理项目中&#xff0c;因为选择了不当的初始化方式&#xff0c;导致整体性能下降了…...