linux下编译unity mono android

本文主要是记录下如何编译mono android以及遇到的一些问题。

编译环境

虚拟机下 ubuntu 22.04.3-desktop-amd64
gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04) 

unity mono 版本 unity-2021.3-mbe

编译前准备

  • 克隆mono仓库,初始化所有git submodules:

    仓库地址:https://github.com/Unity-Technologies/mono/
    克隆mono仓库到本地目录,github上克隆较慢,可以去gitee上找镜像源。记得切换分支为你需要编译的版本,我这里选择的是unity-2021.3-mbe。仓库下有很多子模块的依赖,可以修改mono目录下.gitmodules文件,修改里面的url地址替换成镜像源的地址。(我这边网络不行,我采用手动一个一个克隆),这里还需要注意下有些git submodules里面还会依赖submodules,要确保所有的submodules都初始化成功并且切换到对应的分支上

  • 下载对应版本mono需要的Android NDK

    打开./external/buildscripts/build.pl 搜索ndkVersion可以看到unity-2021.3-mbe 所需要的ndk的版本是r19c,去下载ndk对应的版本,下载地址,下载完后解压到mono目录下的./external/buildscripts/artifacts/Stevedore(如果没有artifacts目录请手动创建),将android-ndk-r19c名字修改为android-ndk-linux

  • 克隆android_krait_signal_handler仓库:

    仓库地址:https://github.com/Unity-Technologies/krait-signal-handler
    克隆android_krait_signal_handler到本地目录,克隆下载来的名字需要将krait-signal-handler修改为android_krait_signal_handler

  • ubuntu添加必备工具

    autoconf automake libtool libtool-bin git cmake python,不知道如何安装请自己查一下。
    安装完所有工具后,先到usr/bin目录下吧libtoollibtoolize这两个文件拷贝到mono目录下./external/buildscripts/artifacts/Stevedore/built-tools/bin/(如果没有built-tools/bin目录请手动创建)。

目录结构:

unity mono这边的编译脚本有指定的路径结构,这里放出我的目录结构

|-- android_krait_signal_handler
|-- unityMono	
|   |-- mono
|   |	|-- external
|	|	|	|-- buildscripts
|	|	|	|	|-- artifacts
|	|	|	|	|	|-- Stevedore
|	|	|	|	|	|	|-- android-ndk-linux
|	|	|	|	|	|	|-- built-tools

mono文件夹对应的是mono仓库
android_krait_signal_handler文件夹对应的是krait-signal-handler仓库
android-ndk-linux文件夹对应的是Android NDK
buildtools文件夹对应工具

编译Android mono

cd ./unityMono/mono 
./external/buildscripts/build_runtime_android.sh

如果编译前准备都做完了,此时应该是会编译成功。
如果有错误可以参考这个文章unity mono库编译笔记
我这边遇到了一个问题,记录下是如何解决的:

error:

arm-linux-androideabi/bin/ld: fatal error: a.out: Input/output error
clang: error: linker command failed with exit code 1 (use -v to see invocation)
configure1:6195: error: in `/mnt/hgfs/Share/unityMono/mono':
configure1:6197: error: C compiler cannot create executables
See `config.log' for more details

这个错误我在mono目录下的./config.log里面查看到的。Input/Output error 这个错误我查了下资料,引发这个错误的可能是链接器(Linker)在处理输出文件时遇到了磁盘I/O问题。

解决思路:

我一开始考虑是不是磁盘空间不足导致的,我只给我的虚拟磁盘分配了20G的空间容量,那我首先选择将磁盘扩容到了100G,并且重新分配磁盘分区。再次执行编译,发现还是这个错误。那么就不是磁盘空间导致的I/O错误。

ubuntu系统下如果路径过长会导致无法文件无法移动和复制,有可能是这个原因导致linker处理文件是出现I/O错误。我选择将mono的文件迁移到到系统桌面。再次执行编译,ok,成功编译!

Release问题:

修改fpic -g为fpic -O2 好像并不可行。找了一篇文章Ubuntu18.04下编译mono-unity-2019.2-mbe,按照文中的说法,编译后再选择用工具去剔除。

  • 19
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity中的mono是一种跨平台解析和运行C#代码的工具,它负责管理C#代码所占用的内存,也被称为mono内存。通过monoUnity可以在不同的平台上运行相同的游戏逻辑代码。C#代码通过mono解析执行,并由mono分配和管理内存。 Unity之所以能够跨平台,是因为它使用了通用中间语言(CIL)。CIL是一种面向对象的语言,它与具体CPU中的寄存器无关,基于堆栈操作。CIL代码在Mono运行时(虚拟机)上运行,可以在任何支持CLI的平台上运行,包括.NET和Mono。这使得Unity可以实现跨平台的能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Unity3D - Unity游戏Mono内存管理与泄漏](https://blog.csdn.net/PAL717/article/details/78655299)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Mono简介、Unity的跨平台、Unity程序从编辑到运行。](https://blog.csdn.net/Michaelia_hu/article/details/88198247)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值