编译tolua——1、编译工具和环境说明

news2025/1/20 10:59:51

大家好,我是阿赵。
之前有朋友问我编译tolua相关的问题。虽然网上也有很多相关的资料可以查询,但我感觉自己也写一篇,作为一个记录也不错。不过一篇文章要把所有内容都说完,可能有点长,所以把整个过程分开几篇文章写一下。这一篇主要是讲个概述,说一下编译需要的工具和环境,源码的下载,还有文件夹的说明。

一、什么是tolua

其实能看这篇文章的人,估计都知道tolua是什么。不过我也啰嗦的说一下。
首先,lua是一种轻量化的脚本语言,不需要编译就能运行,很适合作为游戏热更新使用。
然后,tolua简单来说,就是可以实现在c#调用lua脚本的一个库。
使用Unity引擎开发游戏,可以通过tolua,加载和运行lua脚本。然后lua脚本作为一种文本资源,可以通过热更新的形式修改代码。

二、为什么需要编译tolua

由于tolua源码是c语言,然后我们想在不同的平台下使用这个tolua,比如
1、PC
2、OSX
3、安卓
4、iOS
5、等
如果只是想用tolua的基础功能,那么下载别人已经编译好的库来用也是可以的。
不过很多时候我们是想添加自己的功能给tolua使用,比如添加一些第三方库,添加一些自己写的方法,或者更新某些库之类。
在这些情况下,就需要自己对tolua重新编译。

三、编译工具

首先明确一点,不同平台的编译,需要不同的工具。

1、PC、安卓

PC和安卓的库可以在Windows系统下面编译,使用的工具是mingw,可以去官网下载
下载地址
在这里插入图片描述

需要注意的是,运行的批处理有区分32位和64位。
因为不管是pc还是安卓,编译的时候都区分32位和64位的,所以使用mingw编译的时候也需要注意,要用对应位数的批处理程序来执行。

2、OSX、iOS

OSX和iOS平台的编译,就需要一台苹果的MAC电脑了。这是因为,实际上的编译过程是需要Xcode来编译的,所以在Windows应该是做不到的。
所以,准备一台MAC电脑,然后下载好Xcode就行了。

四、tolua源码下载

这里有2个选择

1、下载官方tolua最新版

下载地址
在这里插入图片描述

这个官方版本其实也已经很久没有人在维护了

2、下载别人配置好的V2版本

下载地址
在这里插入图片描述

这个版本最后一次维护也是几年前了。

这两个版本的区别在于,官方版本是一个比较纯净的版本,不带第三方库,而V2版本,是已经添加了一些第三方库的,比如sqlite、pbc、sproto。
为了能更单纯的说明问题,所以下面我会以官方的纯净版本作为说明。

五、文件夹说明

在这里插入图片描述

下载完之后,把里面的内容解压出来。我建议是在某个盘符下建一个tolua文件夹,然后把东西拷贝进去。因为在编译的时候,我们要用命令行工具跳转到这个文件夹,所以不建议放在很复杂结构的文件夹里面去。
第一次看到这个文件夹,估计很多人都会有点蒙,不知道这堆东西是干什么用的,包括我自己也是这样。
其实划分一下,可以分为这些类别:

1、对应平台设置文件夹

这些文件夹包括:
1.android
2.iOS
3.macjit
4.macnojit
5.ubuntu
6.window
这些文件夹,都是发布对应平台的时候需要用到的,其中
1.android文件夹,是存放编译安卓平台时对应的打包列表Android.mk文件的
2.iOS、macjit、macnojit这三个是编译iOS和OSX时的xcode工程的文件夹
3.ubuntu、window是发布这两个平台时用来编译.a文件的中间存放文件夹。

2、编译完成的输出文件

这里指的是Plugins文件夹
在这里插入图片描述

这里面存放的是各个平台编译出来,最终使用的库文件,比如Windows平台的dll文件,安卓平台的so文件,iOS平台的.a文件等。

3、第三方库文件夹

这个官方的tolua_runtime-master里面有:
1.cjson
2.luajit-2.1
3.luasocket
这些都是需要编译的c语言源码
如果我们需要添加其他第三方库,或者添加自己写的代码,也是通过这种形式去存放。其实放在哪个文件夹,问题都不是很大,因为pc和安卓平台的输入是需要指定路径的,苹果的xcode编译,也是需要在项目里面配置包含库的。

4、编译批处理文件

后缀为sh的文件,这里包括了
在这里插入图片描述

这些文件,其实就是各种平台编译时的批处理文件。
打开其中一个文件看看,比如build_win64.sh:
#!/bin/bash

# 64 Bit Version
mkdir -p window/x86_64

cd luajit-2.1
mingw32-make clean

mingw32-make BUILDMODE=static CC="gcc -m64 -O2" XCFLAGS=-DLUAJIT_ENABLE_GC64
cp src/libluajit.a ../window/x86_64/libluajit.a
mingw32-make clean

cd ..

gcc -m64 -O2 -std=gnu99 -shared \
 tolua.c \
 int64.c \
 uint64.c \
 pb.c \
 lpeg.c \
 struct.c \
 cjson/strbuf.c \
 cjson/lua_cjson.c \
 cjson/fpconv.c \
 luasocket/auxiliar.c \
 luasocket/buffer.c \
 luasocket/except.c \
 luasocket/inet.c \
 luasocket/io.c \
 luasocket/luasocket.c \
 luasocket/mime.c \
 luasocket/options.c \
 luasocket/select.c \
 luasocket/tcp.c \
 luasocket/timeout.c \
 luasocket/udp.c \
 luasocket/wsocket.c \
 -o Plugins/x86_64/tolua.dll \
 -I./ \
 -Iluajit-2.1/src \
 -Iluasocket \
 -lws2_32 \
 -Wl,--whole-archive window/x86_64/libluajit.a -Wl,--no-whole-archive -static-libgcc -static-libstdc++

可以看到,里面都是一些编译的命令
还有一个link_arm64.bat文件,是编译安卓64位时使用的批处理。

5、其他源码文件

在这里插入图片描述

看到一些散放的.h或者.c文件,这些都是编译时需要的源码,其实我觉得可以建一个文件夹专门存放的,毕竟编译是需要的文件,都是有地方可以指定路径的。

六、大概的打包流程

到这里,我们大概能得出一个概念,我们编译这个东西的流程是:
1、准备好工具和源码
2、把需要添加的代码放进去项目
3、去对应的平台的文件夹或者批处理文件添加需要编译的文件
4、运行工具,编译
5、去Plugins的对应文件夹拿到编译好的文件,使用。
过程是这么简单,但实际操作起来总会出现各种问题,一篇文章内容太多也不合适,下一篇文章将会实际编译一下看看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/625576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图文并茂五分钟搞懂react中的reducer

什么是 reducer 函数? 为什么要用 reducer? Reducer 是处理状态的另一种方式。通俗来讲,就是可以让你的复杂组件更加干净,代码更加优雅当你的组件里有好多个状态更新逻辑,并且有些是有一定关联性的,写多个useState会看起来很杂…

SPIFlash-W25QXX使用总结

W25QXX简介 W25QXX,后面的XX指的是Mbit 常见的型号有: W25Q80 W25Q16 W25Q32 W25Q64 W25Q128 注意80是表示8而不是80 所以,换算成字节数,从上到下为: 1MB 2MB 4MB 8MB 16MB 整个flash分成多个块,一个块分成…

Linux配置MySQL环境(三)

Linux配置MySQL环境 一、下载1. 官网下载MySQL2. 百度网盘快速下载MySQL 二、安装1、通过 Xftp 将 MySQL 安装包拷贝到 Linux2、解压缩3、安装 common、libs、client、server4、初步连接 三、卸载四、常用设置1. 修改 root 用户密码 五、使用新密码登录六、开启远程访问七、开放…

购物车按钮

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>购物车按钮展示</title><link href"https://fonts.googleapis.com/css?familyInter:400…

002Mybatis初始化引入

引入依赖 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId> </dependency> 自动检测工程中的DataSource创建并注册SqlSessionFactory实例创建并注册SqlSessionTemplate实例自…

chatgpt赋能python:Python中如何输入一个列表?

Python中如何输入一个列表&#xff1f; 如果你正在使用Python编程语言&#xff0c;那么输入一个列表是很常见的任务。列表是Python中最常用的数据类型之一&#xff0c;它允许我们在一个变量中存储多个值。在这篇文章中&#xff0c;我们将介绍如何使用Python语言输入一个列表&a…

chatgpt赋能python:Python中的16进制输出:从基础到应用

Python中的16进制输出&#xff1a;从基础到应用 在计算机编程中&#xff0c;16进制是一种非常重要的数字系统。对于Python工程师来说&#xff0c;熟练地掌握16进制输出技能非常重要&#xff0c;因为它能够帮助你更好地理解和分析二进制数据。 在本篇文章中&#xff0c;我们将…

JavaSE-03 【流程控制语句】

第一章 流程控制 1.1 流程概述 在一个程序执行的过程中&#xff0c;每条语句的执行顺序对程序的结果是由直接影响的&#xff0c; 也就是&#xff0c;语句的流程对运行结果有着直接的影响&#xff0c;所以&#xff0c;必须清楚知道每条语句的执行流程&#xff0c; 并且&#x…

Gossip分布式通信协议副本管理器说明

Gossip中副本管理器 副本管理器状态 不考虑应用时一个副本管理器应该有的状态&#xff1a; 值&#xff0c;这是由副本管理器维护的应用状态的值&#xff0c;每个副本管理器是一个状态机。起始于一个特定的初始值。此后的状态完全由更新操作决定。值的时间戳&#xff1a;代表更…

chatgpt赋能python:Python的包管理器-pip

Python的包管理器 - pip 什么是pip? pip是Python中的一个包管理工具&#xff0c;它可以用来安装、升级以及管理Python语言中的第三方模块。 如何安装pip 在Python 2.7.9和Python 3.4中&#xff0c;pip已经随着Python自带安装了。 如果你的Python没有安装pip&#xff0c;可…

JavaSSM笔记(四)

MySQL高级 在JavaWeb阶段&#xff0c;我们初步认识了MySQL数据库&#xff0c;包括一些基本操作&#xff0c;比如创建数据库、表、触发器&#xff0c;以及最基本的增删改查、事务等操作。而在此阶段&#xff0c;我们将继续深入学习MySQL&#xff0c;了解它的更多高级玩法&#…

JavaSSM笔记(三)

SpringSecurity 本章我们会一边讲解SpringSecurity框架&#xff0c;一边从头开始编写图书管理系统。 SpringSecurity是一个基于Spring开发的非常强大的权限验证框架&#xff0c;其核心功能包括&#xff1a; 认证 &#xff08;用户登录&#xff09;授权 &#xff08;此用户能…

【From Audio to Talking Heads in Real-Time with AI! RAD-NeRF explained】

视频链接&#xff1a;RAD-NeRF https://me.kiui.moe/radnerf/videos/obama_intro.mp4 From Audio to Talking Heads in Real-Time with AI! RAD-NeRF explained Efficient NeRFs for Real-Time Portrait Synthesis (RAD-NeRF) We’ve heard of deepfakes, we’ve heard of N…

Nacos架构与原理 - 配置模型

文章目录 背景概念介绍配置(Configuration)配置管理 (Configuration Management)配置服务 (Configuration Service)配置项&#xff08;Configuration Item&#xff09;配置集&#xff08;Configuration Set&#xff09;命名空间&#xff08;Namespace&#xff09;配置组&#x…

chatgpt赋能python:Python中如何实现print不换行

Python中如何实现print不换行 在编写Python程序时&#xff0c;我们经常需要使用print语句来输出信息。然而&#xff0c;有时候我们希望在输出信息时不换行&#xff0c;而是将多个输出信息打印在同一行上。这里介绍几种Python中print不换行的方式。 方法一&#xff1a;使用逗号…

Redis7分布式缓存

Redis7分布式缓存 一、Redis入门概述1.主流功能与应用2.命名规则 二、Redis 10 大数据类型1.redis字符串 (String)2. redis列表 (List)3. redis哈希表 (Hash)4. redis集合 (Set)5. redis有序集合 (ZSet)6. redis地理空间(GEO)7. redis基数统计 (HyperLogLog)8. redis位图 (bitm…

wavemlp怎么运行的

1.首先&#xff0c;输入进来的x是batchsize&#xff0c;64&#xff0c;256&#xff0c;256尺寸的。 他会用四个不同的conv组合&#xff0c;theta组合是由二维卷积&#xff08;batchnorm和relu的&#xff09;&#xff0c;得到两个值。 而&#xff0c;x_h和x_w都是通过一个简单…

JavaSE笔记(四)重制版

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eFLuY3vJ-1685927553034)(https://s2.loli.net/2022/09/22/lmKBNFc5wPEgjaS.png)] 面向对象高级篇 经过前面的学习&#xff0c;我们已经了解了面向对象编程的大部分基础内容&#xff0c;这一部分&…

一种新颖的智能优化算法—海鸥优化(SOA)算法

目录 一、SOA理论基础 二、ACO数学模型 2.1 迁徙 2.2 攻击 三、SOA伪代码 四、SOA运行结果 海鸥优化算法(Seagull Optimization Algorithm, SOA)是在2019年由 Dhiman 提出的一种受自然界海鸥启发的新颖全局优化算法&#xff0c;模拟了海鸥群体的迁徙和攻击行为。 一、SOA…

chatgpt赋能python:Python中如何实现1到100的循环?

Python中如何实现1到100的循环&#xff1f; 在Python中&#xff0c;实现1到100的循环非常简单。我们可以通过for循环、while循环和列表生成式来实现这个任务。 1. 使用for循环实现1到100的循环 使用for循环可以让我们轻松地遍历从1到100的整数。这种方法很适合在循环中需要进…