目录
文章最终成功编译出libmono.so如下图所示,历时9天
一、下载文件配置环境
二、下载Unity-Mono库
三、正式开始编译libmono.so
1、libmono.so编译文件基础说明
2、修改相关文件(及其重要)
① 修改/home/用户名/mono/external/buildscripts/build_runtime_android.sh
② 手动克隆/home/用户名/mono/android_krait_signal_handler
③ 修改build.pl
④ 修改configure文件
3、敲打命令,开始编译!
① 配置NDK路径 (临时设置NDK路径)【PS:网上有全局设置的方法懒得搞了】
② 单独执行编译android_krait_signal_handler库(会得到builds.zips等文件)
③ 编译unity-mono库
四、途中可能发生的BUG说明以及解决思路
正式讲解每一个步骤以及报错解决思路,坑爹的地方特别多,特别离谱(作者故意的?)
参考文章:
https://www.jianshu.com/p/b801a9b7cff8 (基本参考它)
unity mono 库编译笔记_qlyy09的博客-CSDN博客
Ubuntu的环境 ndk和jdk环境配置 与 如何编译出Unity的libmono.so - Domefy - 博客园
NDK下载地址
Android NDK下载(r10~r25) 持续更新_StoneLiu999的博客-CSDN博客_android ndk下载
官网NDK下载地址(没有x86) :
不受支持的 NDK 下载 | Android NDK | Android Developers
1、下载NDK (android-ndk-r10e-linux-x86) [必须32位]
https://dl.google.com/android/repository/android-ndk-r10e-linux-x86.zip
2、安装VMware Workstation虚拟机(版本15.5.0 build-14665864)
安装VMware 15.5.0 build-14665864_winfredzhang的博客-CSDN博客
3、下载CentOS 7 64.iso镜像文件(CentOS系统(linux))
Cent0S7系统镜像文件(百度网盘资源)_资深咸鱼~的博客-CSDN博客_centos7百度云下载
版本:CentOS-7-x86_64-Minimal-1708
4、创建CentOS7系统虚拟机-设置基础配置
配置共享文件夹(需要安装VMTools,有坑——如果之前安装过必须重新安装)
至此基础配置完毕,开始配置网络环境(不配置无法进行下载各种库)
5. 配置CentOS 7 64位系统网络环境【及其重要且必要】
参考文章:centOS 7无法连接网络详细解决办法_KookNut39的博客-CSDN博客_centos7网络不通
子网IP(I) 内容填写:IPv4地址(192.168.1.2)前三位,第四位保持0 即(192.168.1.0)
打开NAT设置(S)
完成所有如上操作后点击确认即可,注意必须关闭虚拟机后执行如上操作。
开启CentOS7系统虚拟机,正式开始安装CentOS7系统以及相关配置(VMTools安装、修改相关网络配置)这里不再过多阐述系统安装和VMTools安装(VMTools没安装好 共享文件无法生效)
小提醒:分配内存时不需要按照网上那么复杂地分配,直接选下面的我们是20GB,选完就Done
VMTools安装参考文章:CentOS7安装VMware Tools详细步骤_等待花开I的博客-CSDN博客_centos7安装vmware tools
网络配置:
打开
以管理员身份执行修改网络配置文件保存(ONBOOT=no改为yes)
su
输入密码
vi /etc/sysconfig/network-scripts/ifcfg-eno16777736
i
修改(注意:按下i后就会切换成编辑模式,删除字符要用键盘delete键)
修改完毕后,按Esc按键 + 回车,然后输入下面的三个字符(:wq)
:wq
重启服务【不重启无法生效】
service network restart
ping www.baidu.com 【能ping通说明正常完成网络配置】
Mono版本: Unity_2017.4
源码地址: https://github.com/Unity-Technologies/mono/tree/unity-2017.4
源码下载地址: git clone -b unity-2017.4 https://github.com/Unity-Technologies/mono.git
此处完全和参考文章相同(等跑通后可以换其他版本测试)
注意:unity-2017.4中没有external的额外子库 gitmodules,所以很轻松就完成了这一步,更高版本比如unity2019的,这些子库会很头疼。
将r10e-x86(ndk文件)和Unity-mono库文件以共享文件形式传给虚拟机CentOs7系统,拷贝过去后虚拟机/mnt/hgfs/共享文件夹名/下就会有这些文件,将它们cut到/home/用户名/下(Home文件夹下),因为共享文件夹不允许进行各种修改操作,所以要移出去,移到Home只是我的操作你可以移动到别的地方。
文件夹路径摆放结构如下:
/home/用户名/android-ndk-r10e
/home/用户名/mono
/home/用户名/mono/android_krait_signal_handler(这是一个git库文件中途会克隆下来)
android_krait_signal_handler文件:
直接用git命令执行上面的命令或直接去这个路径下载它也可以。
github.com/Unity-Technologies/krait-signal-handler.git,分支是-master
克隆出来后要放置在/home/用户名/mono/下,文件夹命名必须改android_krait_signal_handler,文件结构如下所示,开始修改第二个文件build.pl
主要是不识别-V -qversion去掉这2个,保留--version -v即可。
报错信息类似:
arm-linux-androideabi-gcc: error: unrecognized option '-V'
arm-linux-androideabi-gcc: error: unrecognized option '-qversion'
修改脚本内容:
for ac_option in --version -v -V -qversion; do //代码中会存在这种-V -qversion的全部改为下面
for ac_option in --version -v; do
ANDROID_NDK_ROOT=/home/用户名/android-ndk-r10e
export ANDROID_NDK_ROOT
echo $ANDROID_NDK_ROOT
执行后会输出/home/用户名/android-ndk-r10e,代表设置成功!
提前安装已知相关的依赖包,注意:有一些依赖包是可能获取不到无法正常下载的,百度一下查找替代的依赖包去安装好。
yum install autoconf automake libtool pkg-config
yum install glib2-devel
yum install pkgconfig glib2
yum install libtool bison
yum install cmake
yum install libc6-dev
yum install ld-linux.so.2(可能ld-linux.so.2找不到就用这个:yum install glibc)
yum install zlib
su
输入密码
cd /home/用户名/mono/android_krait_signal_handler
/home/用户名/android-ndk-r10e/ndk-build clean
/home/用户名/android-ndk-r10e/ndk-build
su
输入密码
cd /home/用户名/mono
./external/buildscripts/build_runtime_android.sh
等待2-3分钟左右出现SUCCESS!完成编译libmono.so。
1、CentOS系统无法联网(以上有说明解决)
2、CentOS系统共享文件夹无效(以上有说明解决)
3、执行编译android_krait_signal_handler库时发生的BUG汇总
3.1 build.pl文件修改第一行为如下,(其他博主都有说明这个我的没问题 所以保持原样)
#!/usr/bin/perl -w
3.2 ndk-build clean执行后会发生报错:
参考文章名字:【排错】CentOS之——/lib/ld-linux.so.2: bad ELF interpreter解决
bash: /usr/local/bin/rar: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
是因为64位系统中安装了32位程序(可能指的是ndk是32位的)
解决方法:
yum install glibc.i686
3.3 ndk-build clean正常执行,之后执行ndk-build报错:(很关键的知识点)
while loading shared libraries: libz.so.1: cannot open shared object file
之后会频繁出现 while loading shared libraries: xxx.so.xxx: cannot open shared object file
意思:没找到 xxx.so.xxx库,可使用:yum whatprovides xxx.so.xxx 来查看哪个包含这个.so库,再使用yum install -y xxx 安装即可。(yum相当于uBuntu的apt)
如上报错就是 yum whatprovides libz.so.1
4、执行./external/buildscripts/build_runtime_android.sh报错汇总:
4.1 linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lkrait-signal-handler
collect2: error: ld returned 1 exit statu
解决方法:修改/home/用户名/mono/external/buildscripts/build_runtime_android.sh
找到-lkrait-signal-handler 前缀改为如下图所示。(上面也有这个截图的)
这一个BUG是我最后解决的一个BUG,至此完成全部BUG解决。
其他乱七八糟的BUG基本可以百度轻松解决的,如果有问题可留言,关于Unity-Mono其他版本还未尝试,比如Unity2019甚至Unity2021版本的可能就不一样了,而网上的目前能看得到的教程只有Unity2017或2018了,很多都是Unity4.x 5.x的,关于Unity2017之后的版本,可能相差也不是很大。