当前位置: 首页 > 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 之后&…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化

iOS 应用的发布流程一直是开发链路中最“苹果味”的环节&#xff1a;强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说&#xff0c;这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发&#xff08;例如 Flutter、React Na…...

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …...

JS红宝书笔记 - 3.3 变量

要定义变量&#xff0c;可以使用var操作符&#xff0c;后跟变量名 ES实现变量初始化&#xff0c;因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符&#xff0c;可以创建一个全局变量 如果需要定义…...

python读取SQLite表个并生成pdf文件

代码用于创建含50列的SQLite数据库并插入500行随机浮点数据&#xff0c;随后读取数据&#xff0c;通过ReportLab生成横向PDF表格&#xff0c;包含格式化&#xff08;两位小数&#xff09;及表头、网格线等美观样式。 # 导入所需库 import sqlite3 # 用于操作…...