使用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这个库没编译,需要先编译下

 

最后说一下,msys2里的pacman真好用啊,用cgywin的时候挺不爽的,一直很怀念linux的apt-get之类的包管理工具,最后才发现msys2,真好用。

posted @ 2016-08-19 13:59  nottvlike  阅读(1476)  评论(0编辑  收藏  举报