Windows 下使用 mingw+msys 交叉编译 Android Unity Mono
对于没有升级到 Unity5.4的用户,发布安卓版本都会有对 C# 脚本进行加密的需求,我们项目在裸奔了很长时间后,决定开始做这件事。
网上查看了很多资料,我很希望直接在 windows 下编译而不去安装虚拟机在 linux 或者在 mac 下安装,大概预计猜测就是 Cygwin, MinGW, MSYS 之类。最终 这篇博客 给我了很大的帮助,最终在继续踩坑和摸索下,完成了编译。
这里只总结下编译的过程,这里是重点,至于加密方法很多,各自选择吧,不在此赘述。
- 下载 Unity-mono 源码
- 我们使用的 5.3,经过查看官方的 Release Note,发布时间,以及 Unity-Mono 的 Commit 日志,发现 Unity Mono 5.3 分支的最后一次提交与 Unity5.3.7p4 保持一致。
- 准备编译环境:MinGW + MSYS
- 下载 MinGW-w64 并安装。(注:原生 MinGW 已经很久不维护,而 MinGW-w64 则一致更新很快,且工具集很全。但是:原生的 MingW 也可以下载和安装,有很多人抱怨自带的下载安装程序下载很慢,如果选择了的这个,为了节省时间,建议直接勾选所有的选项全部下载,否则自己不明白用途到了后期编译会不断出现缺少工具的问题。)
- 下载安装 MSYS,这个只能通过下载原生的 MinGW 安装程序,然后只选择安装 MSYS,而不安装 MinGW。如果不使用 MinGW-w64 那么直接按照上一条所说,下载安装 MinGW 的全部内容即可,如果缺少任何工具,前往 https://sourceforge.net/projects/mingw/files/MSYS/ 自行下载即可,直接覆盖到 msys/1.0/ 下。
- 以上所有安装路径最好不要出现空格。(或者理解为绝对不要出现空格)
- 当你第一次通过安装 MinGW 安装 MSYS 时,安装程序会自动配置 MSYS 需要的 MinGW 所在路径,在 msys/1.0/etc/fstab 文件中:
# Win32_Path Mount_Point
#--------------- -----------
D:/mingw /mingw将 Win32_Path 下的 MinGW 安装路径替换为你本地的 MinGW 安装路径即可。如果不修改到编译最后会因环境变量的问题出错,出现形如:Can't exec "cpp": No such file or directory at ./genmdesc.pl line 53. 的错误,这是 cpp 这个环境变量定义的编译器文件路径最终没有找到可执行文件。
- 为了方便编译,我整理好了一个 MinGW-W64+MSYS 的环境包,点击下载。下载解压后,记住需要修改 mingw-w64/x64/posix-seh/mingw64/msys/1.0/etc/fstab 中 mingw-w64 路径为:$(InstallDir)/mingw-w64/x64/posix-seh/mingw64,$(InstallDir) 为你安装的根目录,不要直接 copy。修改完毕双击 $(InstallDir)/mingw-w64/x64/posix-seh/mingw64/msys/1.0/msys.bat 即可开始使用编译环境。注:旁边的 "MSYS" 和 "MSYS-norxvt" 两个文件是指向 msys.bat 的快捷方式。
- 由于后面编译 Mono 需要一个 Zip 解压程序,以上安装包均不包含,自行前往 https://sourceforge.net/projects/mingw/files/MSYS/Extension/zip/zip-3.0-1/ 进行 下载,然后解压缩直接覆盖到 $(InstallDir)/mingw-w64/x64/posix-seh/mingw64/msys/1.0/ 即可。
- 下载 NDK r10e
- 下载 Zip
- 整个编译过程会用到 zip 命令,而默认的 MinGW+MSYS 环境中没有,可以在这里下载,然后解压缩覆盖到到 $(InstallDir)/mingw-w64/x64/posix-seh/mingw64/msys/1.0/ 下。
- 修改 Mono 编译脚本,位于 Mono 源码目录下 external/buildscripts/:
- 修改文件 build_runtime_android.sh,在文件脚本最最开始处(line:6)添加 "export ANDROID_NDK_ROOT=/$(NdkRoot)",$(NdkRoot) 为你本地的 Ardroid NDK 安装根目录。
- 修改文件 build_runtime_android.sh,将 KRAIT_PATCH_PATH="${CWD}/../../android_krait_signal_handler/build" 修改为:KRAIT_PATCH_PATH="${CWD}/android_krait_signal_handler/build"。(这个项目在编译时会动态 clone,应该被 clone 到源码根目录,如果不修改会 clone 到源码的上两级目录)。
- 修改文件 build_runtime_android.sh,将 -fpic -g -funwind-tables \ 修改为 -fpic -O2 -funwind-tables \ 以便编译为 release 版本。
- 修改文件 build_runtime_android.sh,只保留 armv7的编译,注释掉 armv5, armv6,形如:#clean_build "$CCFLAGS_ARMv5_CPU" "$LDFLAGS_ARMv5" "$OUTDIR/armv5",#clean_build "$CCFLAGS_ARMv6_VFP" "$LDFLAGS_ARMv5" "$OUTDIR/armv6_vfp"。
- 修改文件 build_runtime_android_x86.sh,将 -fpic -g \ 修改为 -fpic -O2 \ 。
- 修改文件 PrepareAndroidSDK.pm,将 elsif(lc $^O eq 'cygwin') 修改为:elsif(lc $^O eq 'cygwin' or lc $^O eq 'msys')。
- 修改 android_krait_signal_handler 编译脚本
- 如果已经启动过第一次编译并且失败或者主动 clone 过 android_krait_signal_handler 项目并存放于 Mono 源码根目录下,则修改其编译脚本。
- 修改 $(CloneDir)/PrepareAndroidSDK.pm,将 elsif(lc $^O eq 'cygwin') 修改为:elsif(lc $^O eq 'cygwin' or lc $^O eq 'msys'),$(CloneDir)为该项目的 clone 本地目录。
- 开始尝试编译
- 开始编译,启动 MSYS 命令行,切换到 Mono 源码根目录,运行 ./external/buildscripts/build_runtime_android.sh,启动编译.
- 如果未处理过 android_krait_signal_handler,那么编译脚本会先 clone 此项目,并且失败,如果启动了 clone 并且失败,那么请参照上一条 “修改 android_krait_signal_handler 编译脚本” 进行修改后重新编译。
- 等待命令行的各种检查,编译,输出,最后成功,会同时编译 armv7 和 x86 两个结果,分别在目录:$(MonoSrcDir)/builds/embedruntimes/android/ 下的 armv7a 和 x86 两个目录,文件为:libmono.so。
至此,按照以上的步骤,所有的编译过程会顺利完成。其中一些步骤都是经过反复实验出错修改最后发现的,并不是一帆风顺。如果新手第一次编译建议严格按照以上步骤进行,等编译顺利通过后再自行修改参数进行自定义。如果按照以上步骤却编译失败,那么以上记录可能有遗漏的地方,请告知。
Have Fun! :)
【参考引用】
Windows 下使用 mingw+msys 交叉编译 Android Unity Mono的更多相关文章
- 开源项目:windows下使用MinGW+msys编译ffmpeg
本文参考了网络上的不少文章,但由于版本环境的问题参考文章并不能直接指导编译,本文吸收多方经验,并在自己多次编译实验的基础上写成,欢迎转载,请注名出处. FFmpeg是在Linux平台下开发的,但 ...
- windows 下使用 MinGW + msys 编译 ffmpeg
本文参考了网络上的不少文章,但由于版本环境的问题参考文章并不能直接指导编译,本文吸收多方经验,并在自己多次编译实验的基础上写成,欢迎转载,请注名出处. FFmpeg是在Linux平台下开发的,但 ...
- Windows下将ImageMagick移植到Android平台
Windows下将ImageMagick移植到Android平台 原文链接 http://www.pedant.cn/2014/06/18/imagemagick-ported-android/ I ...
- 手把手教你在Windows下使用MinGW编译libav(参考libx264的编入)
转自:http://www.th7.cn/Program/cp/201407/242762.shtml 手把手教你在Windows下使用MinGW编译libav libav是在Linux下使用纯c语言 ...
- 在Linux下使用MinGW静态交叉编译带有zlib的libcurl(包括交叉编译openssl,即--cross-compile-prefix=i686-w64-mingw32- mingw)
在Linux下使用MinGW静态交叉编译带有zlib的libcurl libcurl是一个跨平台的.易用的.强大的网络库.在大部分Linux发行版中都有编译好的二进制包可供使用,Mac系统更是将其作为 ...
- 在Windows下使用MinGW静态编译Assimp
使用MinGW静态编译Assimp 到了5月份了,没有写一篇日志,于是自己从知识库里面拿出一篇文章充数吧.这次将要解说怎样在Windows下使用MinGW静态编译Assimp. Assimp是眼下比較 ...
- windows下使用mingw和msvc静态编译Qt5.15.xx
windows下使用mingw和msvc静态编译Qt5.15.xx 下载并安装相关依赖软件 Python version 2.7 https://www.python.org/downloads/ ( ...
- windows 下使用 mingw编译器 调试时 无法跟进源码
windows 下使用 mingw编译器 调试时 无法跟进源码 最近在公司使用QT 开发,官方在线下载的 安装的QT mingw 都是没有debug版本的 由于没有debug版本动态库 所以你调试的时 ...
- windows下使用mingw和msys编译GOTOBLAS和OpenBLAS
在windows下利用msys编译openBLAS若遇到错误提示: gcc: CreateProcess : No such file or directory 问题原因参考:http://www.c ...
随机推荐
- bzoj 2038 莫队入门
http://www.lydsy.com/JudgeOnline/problem.php?id=2038 题意:多次询问区间内取出两个相同颜色的种类数 思路:由于不是在线更新,那么可以进行离线查询,而 ...
- asp.net SimpleImpersonation使用身份模拟访问局域网共享目录
mvc中默认账户的权限很低,缺省情况下,ASP.NET应用程序以本机的ASPNET帐号运行,该帐号属于普通用户组,权限受到一定的限制,以保障ASP.NET应用程序运行的安全.但是有时需要某个ASP.N ...
- 32岁白发菜鸟拿2.6万年薪苦熬10年 NBA首秀便惊艳世人 科比书豪纷纷为他点赞
这是一场普通的常规赛——斯台普斯球馆,湖人的赛季第81场.比赛的结果也没什么意外:客场作战的火箭106-99带走胜利.然而,这一场的斯台普斯却成了欢乐的海洋,现场甚至喊出了MVP的呼声,这份赞誉,送给 ...
- python学习笔记(二)之python简单实践
1 安装python开发环境 Linux环境下自动安装好了python,可以通过以下命令更新到python最新版本. #echo "alias python=/usr/bin/python3 ...
- Vuejs - 深入浅出响应式系统
Vue 最独特的特性之一,是其非侵入性的响应式系统.数据模型仅仅是普通的 Javascript 对象.而当你修改它们时,视图会进行更新.这使得状态管理非常简单直接,不过理解其工作原理同样非常重要,这样 ...
- 01背包问题的延伸即变形 (dp)
对于普通的01背包问题,如果修改限制条件的大小,让数据范围比较大的话,比如相比较重量而言,价值的范围比较小,我们可以试着修改dp的对象,之前的dp针对不同的重量限制计算最大的价值.这次用dp针对不同的 ...
- div圆角
div{ -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius: 10px;}
- 关于Solaris系统“mpt_sas”驱动
1.mpt_sas 驱动源文件所在系统源代码中目录: illumos-soulos/usr/src/uts/common/sys/scsi/adapters/mpt_sas -- 头文件 illum ...
- zoj2001 Adding Reversed Numbers
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2001 Adding Reversed Numbers Time ...
- Linux 入门记录:五、vi、vim 编辑器
一.vi.vim编辑器 vi 是一个命令行界面下的文本编辑工具,最早在 1976 年由 Bill Joy 开发.当时名字叫做 ex.vi 支持绝大多数操作系统(最早在类 Unix 操作系统的 BSD上 ...