找回密码
 立即注册
查看: 445|回复: 0

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

[复制链接]
发表于 2021-11-4 11:40 | 显示全部楼层 |阅读模式
文章目录



        一、前言二、为什么要用lua?热更新三、下载tolua runtime四、MSYS2环境搭建
          1、MSYS2下载与安装2、设置国内镜像源3、安装gcc4、安装make5、小结
        五、编译Windows平台的tolua.dll
          1、编译x86_64架构的tolua.dll1、编译x86架构的tolua.dll
        六、编译Android平台的libtolua.so
          1、NDK下载2、编译arm64-v8a架构的libtolua.so3、编译armeabi-v7a架构的libtolua.so3、编译x86架构的libtolua.so
        七、编译MacOSX平台的tolua.bundle
          1、环境准备2、命令行编译:sh build_osx.sh3、使用Xcode界面编译
        八、编译iOS平台的tolua.a
          1、环境准备2、命令行编译:sh build_ios.sh3、build_ios.sh脚本解说
        九、完毕



一、前言

嗨,大家好,我是新发。
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文件添加
  1. Server = http://mirrors.ustc.edu.cn/msys2/mingw/x86_64/
复制代码
给mirrorlist.msys文件添加
  1. Server = http://mirrors.ustc.edu.cn/msys2/msys/$arch/
复制代码
接着,双击打开msys2.exe,


测试一下hello world,
  1. echo "hello world"
复制代码
如下


可以正常执行就可以继续往下看了~
3、安装gcc

不同的目标平台有对应的gcc工具,我们可以使用这个命令列举所有平台的gcc工具,
  1. pacman -Sl | grep gcc
复制代码
我们可以在列表中看到mingw-w64-i686-gcc和mingw-w64-x86_64-gcc,


安装mingw-w64-i686-gcc,
  1. pacman -S mingw-w64-i686-gcc
复制代码
运行结果如下:


安装mingw-w64-x86_64-gcc,
  1. pacman -S mingw-w64-x86_64-gcc
复制代码
运行结果如下:



4、安装make

与gcc同理,我们先列一下make工具的列表,
  1. pacam -Sl | grep make
复制代码
我们可以在列表中看到mingw-w64-i686-make和mingw-w64-x86_64-make,


安装mingw-w64-i686-make,
  1. pacman -S mingw-w64-i686-make
复制代码
运行结果如下:


安装mingw-w64-x86_64-make,
  1. pacman -S mingw-w64-x86_64-make
复制代码
运行结果如下:


最后在安装make,
  1. pacman -S make
复制代码
运行结果如下:



5、小结

安装MSYS2之后,配置国内源,然后安装gcc和make:
  1. pacman -S mingw-w64-i686-gcc
  2. pacman -S mingw-w64-x86_64-gcc
  3. pacman -S mingw-w64-i686-make
  4. pacman -S mingw-w64-x86_64-make
  5. 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脚本,
  1. sh build_win64.sh
复制代码

开始执行


嗯?有异常,可以看到这个函数重复定义了,


查看一下源码,可以在inet.h中看到声明了这个函数,


解决办法:把下面这个宏定义注释掉,
  1. #ifdef__MINGW32__#defineLUASOCKET_INET_PTON#endif
复制代码
如下:


重新执行
  1. 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脚本,
  1. 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路径为
  1. 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的窗口,执行命令
  1. 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的窗口,执行命令
  1. sh build_arm.sh
复制代码
如下


执行完毕,我们看到有报错,提示找不到I:/android-ndk-r13b-windows-x86_64/android-ndk-r13b/ndk-build,


检查一下ndk-build的路径,路径正确,没问题,


嘛,看回build_arm.sh脚本,


啧啧啧,加上.cmd,


重新执行
  1. 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,


执行命令
  1. 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命令,
执行
  1. xcodebuild -help
复制代码
如果有输出一堆参数说明,则表示Xcode环境正常,如下


为了方便在国内网络环境下下载,我把tolua runtime搬运到CODE CHINA上,
https://codechina.csdn.net/linxinfa/tolua_runtime


在Mac上,我们把tolua runtime下载到本地,
  1. 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目录,
  1. cd /User/mac/GitHub/tolua_runtime
复制代码
如下


我们可以看到,有macjit和macnojit两个版本,


以编译macnojit版本为例,进入macnojit目录,
  1. cd macnojit
复制代码
如下


清理之前编译过程生成的文件,执行
  1. xcodebuild clean
复制代码
如下


看到CLEAN SUCCEEDED则说明清理成功~


开始构建Release版本,执行
  1. xcodebuild -configuration=Release
复制代码
如下


看到BUILD SUCCEEDED则说明构建成功~


在tolua_runtime/macnojit/build/Release目录中就可以看到生成的tolua.bundle啦。


我们可以把它拷贝到Plugins目录中
  1. cp -r build/Release/tolua.bundle ../Plugins
复制代码
如下



上面的命令整合在一起,就是
  1. cd macnojit/
  2. xcodebuild clean
  3. xcodebuild -configuration=Release
  4. 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目录,


直接执行
  1. 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,


你就可以看到对应的这一切~



九、完毕

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 23:08 , Processed in 0.089811 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表