使用Msys2编译unity mono
1,配置msys2
在这里下载msys2
下载安装完成msys2之后,我们还需要安装一些库,可以使用msys2自带的软件包管理工具pacman来安装。
安装前,需要配置下pacman的源(国内的源相比国外的下载速度更快些),我参考了这里
打开c:\msys64\mingw32_shell.bat,输入以下命令
#update the package database and pacman pacman -Sy pacman #install autoconf, automake, libtool, gcc, perl, zip, pkg-config pacman -S autoconf automake libtool gcc perl zip pkg-config
到这一步,msys2环境就配置完了。
2,下载mono源码
在这里下载unity mono源码,这里需要注意不必下载master分支的源码,而是与你的unity3d版本对应的分支的代码,例如我使用的是unity3d 4.7,我没找到4.7的分支代码,所以就下载了4.6分支的代码。
我下载的mono源码是unity-mono-4.6。
3,下载并编译krait_signal_handler
在这里下载krait_signal_handler。
以unity-mono-4.6为例,将unity-mono-4.6放在D盘,将krait_signal_handler改名为android_krait_signal_handler,放在D:\mono-unity-4.6\external目录里。
修改android_krait_signal_handler/build.pl的第10行代码
#!/usr/bin/perl -w
use PrepareAndroidSDK;
use File::Path;
use strict;
use warnings;
sub BuildAndroid
{
PrepareAndroidSDK::GetAndroidSDK(undef, undef, "r9d"); #注意这里,改成你自己的ndk版本
system('$ANDROID_NDK_ROOT/ndk-build clean');
system('$ANDROID_NDK_ROOT/ndk-build');
}
修改android_krait_signal_handler/PrepareAndroidSDK.pm:
sub GetAndroidSDK
{
if(lc $^O eq 'darwin')
{
$HOST_ENV = "macosx";
$TMP = $ENV{"TMPDIR"};
$HOME = $ENV{"HOME"};
}
elsif(lc $^O eq 'linux')
{
$HOST_ENV = "linux";
$TMP = "/tmp";
$HOME = $ENV{"HOME"};
}
elsif(lc $^O eq 'mswin32')
{
$HOST_ENV = "windows";
$TMP = $ENV{"TMP"};
$HOME = $ENV{"USERPROFILE"};
if (-e "Tools/WinUtils/7z/7z.exe")
{
$WINZIP = "Tools/WinUtils/7z/7z.exe";
}
}
elsif(lc $^O eq 'cygwin')
{
$HOST_ENV = "windows";
$TMP = $ENV{"TMP"};
$HOME = $ENV{"HOME"};
}
elsif(lc $^O eq 'msys')
{
$HOST_ENV = "windows";
$TMP = $ENV{"TMP"};
$HOME = $ENV{"HOME"};
}
else
{
die "UNKNOWN " . $^O;
}
最后,打开msys,
cd /d/unity-mono-4.6/external perl build.pl
当然如果你看到krait_signal_handler里面有builds.zip,这是别人编译好的库,你可以将它解压缩放在合适的位置(需要参照build_runtime_android.sh里面链接的位置)。
4,编译mono源码
更改mono-unity-4.6/external/buildscripts/build_runtime_android.sh
#添加android ndk路径配置
export ANDROID_NDK_ROOT=/d/android-ndk-r10e
export ANDROID_PLATFORM=android-9
GCC_PREFIX=arm-linux-androideabi-
GCC_VERSION=4.8
OUTDIR=builds/embedruntimes/android
CWD="$(pwd)"
PREFIX="$CWD/builds/android"
BUILDSCRIPTSDIR=external/buildscripts
#注意ndk版本
perl ${BUILDSCRIPTSDIR}/PrepareAndroidSDK.pl -ndk=r10e -env=envsetup.sh && source envsetup.sh
打开msys2,进入mono-unity-4.6目录,开始编译
cd /d/mono-unity-4.6 ./external/buildscripts/build_runtime_android.sh
5,问题总汇
'ucontext_t' undeclared:
android ndk版本太旧,更换为android ndk r10e
configure: error: C compiler cannot create executables:
我这里是因为krait_signal_handler这个库没编译,需要先编译下

浙公网安备 33010602011771号