【Unity3D】unity-mono编译libmono.so成功

目录

文章最终成功编译出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说明以及解决思路


文章最终成功编译出libmono.so如下图所示,历时9天

【Unity3D】unity-mono编译libmono.so成功_第1张图片


 正式讲解每一个步骤以及报错解决思路,坑爹的地方特别多,特别离谱(作者故意的?)

参考文章:

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系统虚拟机-设置基础配置

【Unity3D】unity-mono编译libmono.so成功_第2张图片
【Unity3D】unity-mono编译libmono.so成功_第3张图片

 【Unity3D】unity-mono编译libmono.so成功_第4张图片

 【Unity3D】unity-mono编译libmono.so成功_第5张图片

 【Unity3D】unity-mono编译libmono.so成功_第6张图片

 【Unity3D】unity-mono编译libmono.so成功_第7张图片

 【Unity3D】unity-mono编译libmono.so成功_第8张图片

 【Unity3D】unity-mono编译libmono.so成功_第9张图片

【Unity3D】unity-mono编译libmono.so成功_第10张图片

配置共享文件夹(需要安装VMTools,有坑——如果之前安装过必须重新安装)

【Unity3D】unity-mono编译libmono.so成功_第11张图片

 至此基础配置完毕,开始配置网络环境(不配置无法进行下载各种库)

5. 配置CentOS 7 64位系统网络环境【及其重要且必要】

参考文章:centOS 7无法连接网络详细解决办法_KookNut39的博客-CSDN博客_centos7网络不通

【Unity3D】unity-mono编译libmono.so成功_第12张图片

【Unity3D】unity-mono编译libmono.so成功_第13张图片

 【Unity3D】unity-mono编译libmono.so成功_第14张图片

【Unity3D】unity-mono编译libmono.so成功_第15张图片

 子网IP(I) 内容填写:IPv4地址(192.168.1.2)前三位,第四位保持0 即(192.168.1.0)【Unity3D】unity-mono编译libmono.so成功_第16张图片

 打开NAT设置(S)

【Unity3D】unity-mono编译libmono.so成功_第17张图片

完成所有如上操作后点击确认即可,注意必须关闭虚拟机后执行如上操作。

开启CentOS7系统虚拟机,正式开始安装CentOS7系统以及相关配置(VMTools安装、修改相关网络配置)这里不再过多阐述系统安装和VMTools安装(VMTools没安装好 共享文件无法生效)

小提醒:分配内存时不需要按照网上那么复杂地分配,直接选下面的我们是20GB,选完就Done 

【Unity3D】unity-mono编译libmono.so成功_第18张图片

 VMTools安装参考文章:CentOS7安装VMware Tools详细步骤_等待花开I的博客-CSDN博客_centos7安装vmware tools

网络配置:

打开

【Unity3D】unity-mono编译libmono.so成功_第19张图片

以管理员身份执行修改网络配置文件保存(ONBOOT=no改为yes)

su

输入密码

vi /etc/sysconfig/network-scripts/ifcfg-eno16777736

i

修改(注意:按下i后就会切换成编辑模式,删除字符要用键盘delete键)

【Unity3D】unity-mono编译libmono.so成功_第20张图片

修改完毕后,按Esc按键 + 回车,然后输入下面的三个字符(:wq)

:wq

重启服务【不重启无法生效】

service network restart

ping www.baidu.com 【能ping通说明正常完成网络配置】

二、下载Unity-Mono库

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的,这些子库会很头疼。

三、正式开始编译libmono.so

1、libmono.so编译文件基础说明

将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库文件中途会克隆下来)

【Unity3D】unity-mono编译libmono.so成功_第21张图片

【Unity3D】unity-mono编译libmono.so成功_第22张图片

 【Unity3D】unity-mono编译libmono.so成功_第23张图片

 【Unity3D】unity-mono编译libmono.so成功_第24张图片

 2、修改相关文件(及其重要)

① 修改/home/用户名/mono/external/buildscripts/build_runtime_android.sh

【Unity3D】unity-mono编译libmono.so成功_第25张图片

【Unity3D】unity-mono编译libmono.so成功_第26张图片

【Unity3D】unity-mono编译libmono.so成功_第27张图片

 【Unity3D】unity-mono编译libmono.so成功_第28张图片

 ② 手动克隆/home/用户名/mono/android_krait_signal_handler

 android_krait_signal_handler文件:

【Unity3D】unity-mono编译libmono.so成功_第29张图片

直接用git命令执行上面的命令或直接去这个路径下载它也可以。
github.com/Unity-Technologies/krait-signal-handler.git,分支是-master

克隆出来后要放置在/home/用户名/mono/下,文件夹命名必须改android_krait_signal_handler,文件结构如下所示,开始修改第二个文件build.pl

③ 修改build.pl

【Unity3D】unity-mono编译libmono.so成功_第30张图片

 【Unity3D】unity-mono编译libmono.so成功_第31张图片

④ 修改configure文件 

主要是不识别-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

3、敲打命令,开始编译!

① 配置NDK路径 (临时设置NDK路径)【PS:网上有全局设置的方法懒得搞了】

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

② 单独执行编译android_krait_signal_handler库(会得到builds.zips等文件)

su
输入密码
cd /home/用户名/mono/android_krait_signal_handler
/home/用户名/android-ndk-r10e/ndk-build clean
/home/用户名/android-ndk-r10e/ndk-build

③ 编译unity-mono库

su
输入密码
cd /home/用户名/mono
./external/buildscripts/build_runtime_android.sh

等待2-3分钟左右出现SUCCESS!完成编译libmono.so。

四、途中可能发生的BUG说明以及解决思路

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 前缀改为如下图所示。(上面也有这个截图的)

【Unity3D】unity-mono编译libmono.so成功_第32张图片

 这一个BUG是我最后解决的一个BUG,至此完成全部BUG解决。

其他乱七八糟的BUG基本可以百度轻松解决的,如果有问题可留言,关于Unity-Mono其他版本还未尝试,比如Unity2019甚至Unity2021版本的可能就不一样了,而网上的目前能看得到的教程只有Unity2017或2018了,很多都是Unity4.x 5.x的,关于Unity2017之后的版本,可能相差也不是很大。

你可能感兴趣的:(Unity3d,个人见解,unity,游戏引擎,Unity安卓加密)