游戏开发进阶篇教你在Windows平台编译tolua runtime的各个平台库(Unity | 热更新 | tolua | 交叉编译)

Posted 林新发

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了游戏开发进阶篇教你在Windows平台编译tolua runtime的各个平台库(Unity | 热更新 | tolua | 交叉编译)相关的知识,希望对你有一定的参考价值。

一、前言

嗨,大家好,我是新发。
Unity项目中使用了tolua framework,因为某种原因需要重新编译tolua runtime,顺手写篇教程,希望可以帮助到有需要的同学~

注:关于Unity中使用tolua framework,我之前写过一篇教程,感兴趣的同学可以看看:《Unity使用tolua框架教程: LuaFramewrk》
在这里插入图片描述

二、为什么要用lua?热更新

首先,关于为什么要用lua,我这里简单啰嗦几句。
游戏开发中,我们一般都需要实现热更新的功能,比如游戏运营过程中,需要更新美术资源、逻辑、配置等等,如果不使用热更新技术,就需要重新打整包,用户需要重新下载安装游戏,用户流失会很大。热更新可以在不重新下载整个游戏的情况下,更新游戏的局部内容。
Unity项目默认的开发语言是C#,如果你想更新某段C#代码就很麻烦了,你可以通过运行时重新加载dll的方式,但是这种方式很危险,如果你的项目上架了应用市场,大概率被应用市场视为违规操作而下架的。
在这里插入图片描述
不过这是难不倒聪明的程序员们的,lua这门动态脚本语言就很适合来做热更,为了方便在Unity中使用lua,人们封装了很多框架,比如toluaxluauluaslua等等,本质都是在Unity环境里内嵌一个lua虚拟机(使用c语言实现的虚拟机),游戏运行时动态解析lua脚本并执行,所以开发人员就可以把一些逻辑用lua来实现,然后再通过服务器下载lua脚本(一般是lua源码做加密后再打成AssetBundle文件,或者是使用luaclua源码编译成字节码然后再打成AssetBundle文件),从而实现热更的目的。
在这里插入图片描述
我们以tolua框架为例,它的lua虚拟机tolua runtime是使用C语言编写的,我们想要让这个lua虚拟机可以在不同的平台(比如WindowsandroidMacOSios)上运行,就需要把它编译成不同目标平台的可执行文件。
在这里插入图片描述
本文我要讲的,就是这个编译过程,那么,我们开始吧~

三、下载tolua runtime

GitHub上下载tolua runtime,地址:https://github.com/topameng/tolua_runtime
在这里插入图片描述
下载下来后,保存在本地目录中:e:/GitHub/tolua_runtime,(下文执行命令时会需要指定这个路径)
可以看到各种build脚本,
在这里插入图片描述
这些build脚本是用shell写的,需要在Linux环境下运行,不过,聪明的程序员们做了一个MSYS2,通过它我们可以在Windows系统下执行.sh脚本。

四、MSYS2环境搭建

科普:MSYS2MSYS的一个升级版,准确的说是集成了pacmanMingw-w64Cygwin升级版, 提供了bash shellLinux环境、版本控制软件(git / hg)和MinGW-w64工具链。
在这里插入图片描述

1、MSYS2下载与安装

MSYS2官网:https://www.msys2.org/
在这里插入图片描述
在官网下载msys2到本地,双击它执行安装,
在这里插入图片描述
安装成功后,可以看到安装目录中的文件如下,用过Linux的同学看到这些文件夹应该很熟悉:etchomeusrtmpvar等。
在这里插入图片描述

2、设置国内镜像源

我们还需要下载额外的工具包,通过MSYS2pacman命令(pacman就是package manager的意思)即可下载安装对应的工具包,类似于pythonpip install命令。
不过,工具包的源在国外,我们需要设置一下国内的源,进入etc\\pacman.d目录,
在这里插入图片描述
用文本编辑器打开mirrorlist.mingw32
在这里插入图片描述
添加中科大的源:Server = http://mirrors.ustc.edu.cn/msys2/mingw/i686/
在这里插入图片描述
同理,给mirrorlist.mingw64文件添加

Server = http://mirrors.ustc.edu.cn/msys2/mingw/x86_64/

mirrorlist.msys文件添加

Server = http://mirrors.ustc.edu.cn/msys2/msys/$arch/

接着,双击打开msys2.exe
在这里插入图片描述
测试一下hello world

echo "hello world"

如下
在这里插入图片描述
可以正常执行就可以继续往下看了~

3、安装gcc

不同的目标平台有对应的gcc工具,我们可以使用这个命令列举所有平台的gcc工具,

pacman -Sl | grep gcc

我们可以在列表中看到mingw-w64-i686-gccmingw-w64-x86_64-gcc
在这里插入图片描述
安装mingw-w64-i686-gcc

pacman -S mingw-w64-i686-gcc 

运行结果如下:
在这里插入图片描述
安装mingw-w64-x86_64-gcc

pacman -S mingw-w64-x86_64-gcc

运行结果如下:
在这里插入图片描述

4、安装make

gcc同理,我们先列一下make工具的列表,

pacam -Sl | grep make

我们可以在列表中看到mingw-w64-i686-makemingw-w64-x86_64-make
在这里插入图片描述
安装mingw-w64-i686-make

pacman -S mingw-w64-i686-make

运行结果如下:
在这里插入图片描述
安装mingw-w64-x86_64-make

pacman -S mingw-w64-x86_64-make

运行结果如下:
在这里插入图片描述
最后在安装make

pacman -S make

运行结果如下:
在这里插入图片描述

5、小结

安装MSYS2之后,配置国内源,然后安装gccmake

pacman -S mingw-w64-i686-gcc 
pacman -S mingw-w64-x86_64-gcc 
pacman -S mingw-w64-i686-make 
pacman -S mingw-w64-x86_64-make
pacman -S make 

五、编译Windows平台的tolua.dll

上面环境准备好之后,就可以开始编译Windows平台的tolua.dll啦~

1、编译x86_64架构的tolua.dll

我们可以看到mingw32位和64位两个exe
在这里插入图片描述
要编译64位架构的库要使用mingw64.exe,编译32位架构的库要使用mingw32.exe
现在我们要编译x86_64架构的tolua.dll,所以我们双击打开mingw64.exe
在这里插入图片描述
cdtolua runtime所在的目录,
在这里插入图片描述
执行build_win64.sh脚本,

sh build_win64.sh

在这里插入图片描述
开始执行
在这里插入图片描述
嗯?有异常,可以看到这个函数重复定义了,
在这里插入图片描述
查看一下源码,可以在inet.h中看到声明了这个函数,
在这里插入图片描述
解决办法:把下面这个宏定义注释掉,

#ifdef __MINGW32__
#define LUASOCKET_INET_PTON
#endif

如下:
在这里插入图片描述
重新执行

sh build_win64.sh

如下,
在这里插入图片描述
执行完毕,没有报错,成功~
在这里插入图片描述
可以在tolua_runtime/Plugins/x86_64目录中看到生成tolua.dll了,
在这里插入图片描述

1、编译x86架构的tolua.dll

编译32位架构的库要使用mingw32.exex8632位架构的,所以我们双击打开mingw32.exe

在这里插入图片描述
cdtolua runtime所在的目录,
在这里插入图片描述
执行build_win64.sh脚本,

sh build_win32.sh

如下,
在这里插入图片描述
执行完毕,没有报错,成功~
在这里插入图片描述
可以在tolua_runtime/Plugins/x86目录中看到生成tolua.dll了,
在这里插入图片描述

六、编译Android平台的libtolua.so

Windows要编译Android平台的库(这个叫交叉编译),需要通过NDK工具来完成。

科普:
交叉编译是在一个平台上生成另一个平台上的可执行代码,比如我们这里要在Windows要编译Android平台的库;
要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),比如我们这里说的NDK,然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。

1、NDK下载

官网下载:https://developer.android.google.cn/ndk/downloads/
目前最新的版本是r21e版本,
在这里插入图片描述
因为我本机之前已经下载过一个r13b版本的NDK,所以我就不重新下载最新版本啦~
在这里插入图片描述
如上,我的NDK路径为

I:/android-ndk-r13b-windows-x86_64/android-ndk-r13b

这个路径下文等下会用到~

2、编译arm64-v8a架构的libtolua.so

要编译64位架构的库,需要使用mingw64.exe,所以我们打开mingw64.exe,同理先cdtolua runtime所在的目录,
在这里插入图片描述
在运行脚本之前,我们需要先配置一下NDK的路径,用文本编辑器打开tolua_runtime目录中的build_arm64.sh
在这里插入图片描述
设置NDK的路径为我们本地的NDK路径,
在这里插入图片描述
然后我们注意看脚本,如果是使用msys系统来执行编译,则执行link_arm64.bat
在这里插入图片描述
嘛,用文本编辑器打开link_arm64.bat瞧一瞧~
在这里插入图片描述
可以看到,在link_arm64.bat里也要设置一下NDK的路径,我们把它设置为本地NDK路径,
在这里插入图片描述
好了,回到mingw64.exe的窗口,执行命令

sh build_arm64.sh

如下
在这里插入图片描述
执行完毕
在这里插入图片描述
可以在tolua_runtime/Plugins/Android/libs/arm64-v8a目录中看到生成libtolua.so了,
在这里插入图片描述

3、编译armeabi-v7a架构的libtolua.so

要编译32位架构的库,需要使用mingw32.exe,所以我们打开mingw32.exe,同理先cdtolua runtime所在的目录,
在这里插入图片描述
在运行脚本之前,我们需要先配置一下NDK的路径,用文本编辑器打开tolua_runtime目录中的build_arm.sh
在这里插入图片描述
设置NDK的路径为我们本地的NDK路径,
在这里插入图片描述
回到mingw32.exe的窗口,执行命令

sh build_arm.sh

如下
在这里插入图片描述
执行完毕,我们看到有报错,提示找不到I:/android-ndk-r13b-windows-x86_64/android-ndk-r13b/ndk-build
在这里插入图片描述
检查一下ndk-build的路径,路径正确,没问题,
在这里插入图片描述
嘛,看回build_arm.sh脚本,
在这里插入图片描述
啧啧啧,加上.cmd
在这里插入图片描述
重新执行

sh build_arm.sh

执行完毕,没有报错,成功~
在这里插入图片描述
可以在tolua_runtime/Plugins/Android/libs/armeabi-v7a目录中看到生成libtolua.so了,
在这里插入图片描述

3、编译x86架构的libtolua.so

要编译32位架构的库,需要使用mingw32.exe,所以我们打开mingw32.exe,同理先cdtolua runtime所在的目录,
在这里插入图片描述
在运行脚本之前,我们需要先配置一下NDK的路径,用文本编辑器打开tolua_runtime目录中的build_x86.sh
在这里插入图片描述
设置NDK的路径为我们本地的NDK路径,顺手给ndk-build加上.cmd
在这里插入图片描述
执行命令

sh build_x86.sh

如下
在这里插入图片描述
执行完毕,没有报错,成功~
在这里插入图片描述
可以在tolua_runtime/Plugins/Android/libs/x86目录中看到生成libtolua.so了,
在这里插入图片描述

七、编译MacOSX平台的tolua.bundle

1、环境准备

编译苹果OSX平台的tolua.bundle,需要一台苹果电脑(macOS系统),比如我这台是macOS High Sierra 10.13.6
在这里插入图片描述
另外还需要有Xcode,我装的是9.3版本的Xcode
在这里插入图片描述
我们先打开终端,测试一下xcodebuild命令,
执行

xcodebuild -help

如果有输出一堆参数说明,则表示Xcode环境正常,如下
在这里插入图片描述
为了方便在国内网络环境下下载,我把tolua runtime搬运到CODE CHINA上,
https://codechina.csdn.net/linxinfa/tolua_runtime
在这里插入图片描述
Mac上,我们把tolua runtime下载到本地,

git clone https://codechina.csdn.net/linxinfa/tolua_runtime.git

如下
在这里插入图片描述
下载完成,
在这里插入图片描述
这里我要特别提醒一下,不要在Windows通过git clone文件后拷贝到Mac上,因为Windows的文本默认是dos格式,换行符 CR LFLinux的文本是unix格式,换行符 LFMac系统下文本换行符为CR,如果把在Windowsgit clone的文件拷贝到Mac上,会出现各种奇奇怪怪的问题,网上就有人踩过此坑,可以看这里:https://www.erlo.vip/share/2/19210.html

好了,环境准备就绪,下面就可以开始编译了~

2、命令行编译:sh build_osx.sh

在终端中进入到tolua_runtime目录,

cd /User/mac/GitHub/tolua_runtime

如下
在这里插入图片描述
我们可以看到,有macjitmacnojit两个版本,
在这里插入图片描述
以编译macnojit版本为例,进入macnojit目录,

cd macnojit

如下
在这里插入图片描述
清理之前编译过程生成的文件,执行

xcodebuild clean

如下
在这里插入图片描述
看到CLEAN SUCCEEDED则说明清理成功~
在这里插入图片描述
开始构建Release版本,执行

xcodebuild -configuration=Release

如下
在这里插入图片描述
看到BUILD SUCCEEDED则说明构建成功~
在这里插入图片描述
tolua_runtime/macnojit/build/Release目录中就可以看到生成的tolua.bundle啦。
在这里插入图片描述
我们可以把它拷贝到Plugins目录中

cp -r build/Release/tolua.bundle ../Plugins

如下
在这里插入图片描述
在这里插入图片描述
上面的命令整合在一起,就是

cd macnojit/
xcodebuild clean
xcodebuild -configuration=Release
cp -r build/Release/tolua.bundle ../Plugins/

事实上,作者已经帮我们写好了脚本build_osx.sh,我们只需执行这个build_osx.sh就好了,我上面挨条命令执行是为了演示这个过程,方便大家理解~
在这里插入图片描述
那么,我们直接执行build_osx.sh看看吧~
在这里插入图片描述
生成成功~
在这里插入图片描述

3、使用Xcode界面编译

如果不想用命令行,也可以直接打开Xcode工程,
在这里插入图片描述
点击菜单Product/Clean
在这里插入图片描述
再点击菜单Product/Archive
在这里插入图片描述
然后再点击Export
在这里插入图片描述

在这里插入图片描述
填写导出的文件夹名称,设置导出的路径,点击Export
在这里插入图片描述
在导出路径中就可以看到生成的tolua.bundle啦。
在这里插入图片描述

八、编译iOS平台的tolua.a

1、环境准备

编译iOS平台的库也需要在苹果电脑上执行,同样需要xcode环境,与上面一致~

2、命令行编译:sh build_ios.sh

在终端里进入tolua_runtime目录,
在这里插入图片描述
直接执行

sh build_ios.sh

如下
在这里插入图片描述
执行成功,可以在tolua_runtime/Plugins/iOS目录中看到生成的libtolua.a
在这里插入图片描述

3、build_ios.sh脚本解说

build_ios.sh脚本主要做三件事:
1 交叉编译luajit,分别编译armv7、armv7s、arm64架构的libluajit.a
2 把三个架构的libluajit.a合并在一起,以便支持不同配置的iOS设备;
3 执行xcode编译,构建iOS平台的libtolua.a
在这里插入图片描述
如果你打开iOS文件夹中的tolua.xcodeproj
在这里插入图片描述
你就可以看到对应的这一切~
在这里插入图片描述

九、完毕

好了,每个平台的库的编译流程都顺利走了一遍,就先这样吧,我是新发,拜拜~

以上是关于游戏开发进阶篇教你在Windows平台编译tolua runtime的各个平台库(Unity | 热更新 | tolua | 交叉编译)的主要内容,如果未能解决你的问题,请参考以下文章

游戏开发实战手把手教你在Windows上通过WSL运行Skynet,不用安装虚拟机,方便快捷(WSL | Linux | Ubuntu | Skynet | VSCode)

游戏开发实战手把手教你在Windows上通过WSL运行Skynet,不用安装虚拟机,方便快捷(WSL | Linux | Ubuntu | Skynet | VSCode)

编译实战 | 手摸手教你在Windows环境下运行Redis6.x

Application Uploader-教你在Windows下上传iOS APP到苹果应用商店

教你在Windows下Gradle如何调试Spring5.2.x

教你在Windows下Gradle如何调试Spring5.2.x