游戏开发进阶篇教你在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
,人们封装了很多框架,比如tolua
、xlua
、ulua
、slua
等等,本质都是在Unity
环境里内嵌一个lua
虚拟机(使用c语言
实现的虚拟机),游戏运行时动态解析lua
脚本并执行,所以开发人员就可以把一些逻辑用lua
来实现,然后再通过服务器下载lua
脚本(一般是lua
源码做加密后再打成AssetBundle
文件,或者是使用luac
将lua
源码编译成字节码然后再打成AssetBundle
文件),从而实现热更的目的。
我们以tolua
框架为例,它的lua
虚拟机tolua runtime
是使用C语言
编写的,我们想要让这个lua
虚拟机可以在不同的平台(比如Windows
、android
、MacOS
、ios
)上运行,就需要把它编译成不同目标平台的可执行文件。
本文我要讲的,就是这个编译过程,那么,我们开始吧~
三、下载tolua runtime
从GitHub
上下载tolua runtime
,地址:https://github.com/topameng/tolua_runtime
下载下来后,保存在本地目录中:e:/GitHub/tolua_runtime
,(下文执行命令时会需要指定这个路径)
可以看到各种build
脚本,
这些build
脚本是用shell
写的,需要在Linux
环境下运行,不过,聪明的程序员们做了一个MSYS2
,通过它我们可以在Windows
系统下执行.sh
脚本。
四、MSYS2环境搭建
科普:MSYS2
是MSYS
的一个升级版,准确的说是集成了pacman
和Mingw-w64
的Cygwin
升级版, 提供了bash shell
等Linux
环境、版本控制软件(git / hg
)和MinGW-w64
工具链。
1、MSYS2下载与安装
MSYS2
官网:https://www.msys2.org/
在官网下载msys2
到本地,双击它执行安装,
安装成功后,可以看到安装目录中的文件如下,用过Linux
的同学看到这些文件夹应该很熟悉:etc
、home
、usr
、tmp
、var
等。
2、设置国内镜像源
我们还需要下载额外的工具包,通过MSYS2
的pacman
命令(pacman
就是package manager
的意思)即可下载安装对应的工具包,类似于python
的pip 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-gcc
和mingw-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-make
和mingw-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
之后,配置国内源,然后安装gcc
和make
:
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
我们可以看到mingw
有32
位和64
位两个exe
,
要编译64
位架构的库要使用mingw64.exe
,编译32
位架构的库要使用mingw32.exe
,
现在我们要编译x86_64
架构的tolua.dll
,所以我们双击打开mingw64.exe
,
cd
到tolua 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.exe
,x86
即32
位架构的,所以我们双击打开mingw32.exe
,
cd
到tolua 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
,同理先cd
到tolua 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
,同理先cd
到tolua 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
,同理先cd
到tolua 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 LF
。Linux
的文本是unix
格式,换行符 LF
,Mac
系统下文本换行符为CR
,如果把在Windows
下git clone
的文件拷贝到Mac
上,会出现各种奇奇怪怪的问题,网上就有人踩过此坑,可以看这里:https://www.erlo.vip/share/2/19210.html
好了,环境准备就绪,下面就可以开始编译了~
2、命令行编译:sh build_osx.sh
在终端中进入到tolua_runtime
目录,
cd /User/mac/GitHub/tolua_runtime
如下
我们可以看到,有macjit
和macnojit
两个版本,
以编译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到苹果应用商店