欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

MONO源码编译笔记-版本:unity-2018.4-mbe

发布时间:2025/3/18 编程问答 41 豆豆
生活随笔 收集整理的这篇文章主要介绍了 MONO源码编译笔记-版本:unity-2018.4-mbe 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

编译了一个星期,终于成功。官方的编译文件有问题,具体在后面写了。

一,编译不成功,看了下面一些网址

https://www.veryarm.com/117013.html


https://hacpai.com/article/1537455295351


http://bbs.ez168.net/t/topic/81


https://www.qiufengblog.com/articles/mono-load-exe.html

 

二,最终,回到官方的git网址 https://github.com/Unity-Technologies/mono.git,根据官方指导来尝试,尝试如下

操作系统环境:布置在阿里云上的ubuntu 18.0.4 LTS


1, 查看ubuntu系统版本:

lsb_rerease -a

2,mkdir 创建目录

  cd /rootmkdir monocd monomkdir bin

3, 设置变量,将/root/mono/bin目录添加到环境变量中,PATH就是环境变量,中间用冒号隔开

PREFIX=/root/mono PATH=\$PREFIX/bin:\$PATH echo $PATH

  输出如下:/root/mono/bin:/root/mono/mybin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games


4,克隆远程库

  cd monogit clone -b unity-2018.4-mbe https://github.com/Unity-Technologies/mono.git

     

5,修改编译文件错误                                                                   

打开 mono/mini目录下的 makefile文件,找到

libbdwgc_libs = $(monodir)/external/bdwgc/libgc_static.la

改为

libbdwgc_libs = $(monodir)/external/bdwgc/libgc.la

 

,若不改,将在make时报错如下
/usr/bin/ld: ../../external/bdwgc/.libs/libgc-static.a(gc.o): relocation R_X86_64_PC32 against symbol 'GC_arrays' can not be used when making a shared object: recompile with -fPIC
注意:unity-2018.2-mbe是可以编译通过的,其编译出错的版本包括: unity-2018.4-mbe, unity-2019.1-mbe

6,执行autogen

cd mono ./autogen --prefix=\$PREFIX ./autogen --prefix=\$PREFIX

 

注意是执行了两次./autogen --prefix=\$PREFIX,只执行一次会在后面make时报错
因为执行第一次时,external/bdwgc文件夹是空的,mono/autogen.sh 会从git上拉取需要的文件到 external/bdwgc,执行第二次是为了执行bdwgc下的 autogen.sh


7,安装monolite, 若是安装了Mono,就不需要执行这个了

cd mono make get-monolite-latest

8,make   --很慢,全程50分钟左右

make

9,make instal    --将生成的东西放到 --prefix指定的目录 /root/mono/bin下,我们关心的libmonobdwgc-2.0.so就在此生成

make install

 

 三,总结了一些经验


经验:
1,代码热更的 Assembly-CSharp.dll最好是从打出的APK中取出。
实际测试中发现,若从编辑器下的library/scriptassembly下拿 Assembly-CSharp.dll,然后放到网上,然后 启动游戏下载此dll(安卓下),会报错进不了游戏。
报错如下:

/? W/mono: Could not load file or assembly 'UnityEditor, Version=0.0.0.0. Cultrue=neutral. PublicKeyToken=null" or one of its dependencies/? E/Unity: FileNotFoundException: Could not load file of assembly 'UnityEditor. Version=0.0.0.0 .....' or one of its dependencies

 

2,MakeFile编译时,若有报错,最重要的是看它的堆栈。
它的堆栈有些特殊,是以 leaving directory的方式显示的。
看到错误不要慌,根据堆栈提示找到报错在哪个MakeFile文件的哪一行,然后此makeFile,看看为什么
比如这个在编译 unity-2018.4-mbe的MONO源码时,make命令执行了一段时间后报错如下:

/usr/bin/ld: ../../external/bdwgc/.libs/libgc-static.a(gc.o): relocation R_X86_64_PC32 against symbol 'GC_arrays' can not be used when making a shared object: recompile with -fPIC/usr/bin/ld: final link failed: Bad value collect2 : error: ld returned 1 exit value MakeFile:1581: recipe for target 'libmonobdwgc-2.0.la' failed make[4]: *** [libmonobdwgc-2.0.la] Error 1 make[4]: Leving directory '/root/mono/mono/mini' MakeFile:1473: recipe for target 'all' failed ....

 

从这里可以看出,错误最初发生在 /root/mono/mono/mini文件夹下的MakeFile文件的1581行。

打开一看,原来是把动态库文件错写成了静态库文件,难怪说不能链接静态库。这是unity开发人员的BUG

 

目前的问题是:

1,编译出的so文件过大,后面有时间再查找原因

2,运行时是 否能正确执行,没检验

3,最好能从build_runtime_android.sh直接编译

总结

以上是生活随笔为你收集整理的MONO源码编译笔记-版本:unity-2018.4-mbe的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。