tcc编译器教程2 编译lua解释器
本文主要介绍了使用tcc编译器编译lua解释器源码。
1 介绍
lua是一门编程语言,开源且源码很容易编译,我平时用来测试C语言编程环境时经常使用。一般能编译成功就说明编程环境设置正常。下面用之前设置好的tcc编程环境进行测试。
2 获取源码
我一般有保留多个版本的lua源码进行测试,你可以去官网进行下载.
官网地址
https://www.lua.org/home.html
下载页面
https://www.lua.org/download.html
最新版本即可,现在最新版为Lua 5.4.7,直接下载地址为
https://www.lua.org/ftp/lua-5.4.7.tar.gz
下载下来的文件保存到任意文件夹,我保存在C:\run\test,解压得到lua-5.4.7文件夹,文件如下

其中src就是源码文件夹。
3 初次编译
将前文配置好的tcc编程环境.bat复制到C:\run\test\lua-5.4.7\src下,直接打开。输入下面批处理指令
::编译所有c文件并生成可执行文件
tcc *.c
::可执行文件名称为lapi.exe
编译会失败,显示luac.c: error: ‘main’ defined twice,因为luac.c是一个lua编译器源码,里面也有一个main函数,luac.c文件暂时不用到,可以直接删除,或者想剪切到其他文件夹保留。

删除或移动后,重新执行上面命令,没有提示错误信息即编译成功,一般编译速度很快。文件夹下面会生成lapi.exe文件,点击打开


即说明编译成功,你可以输入一些lua代码测试一下效果。
print("你好,世界")
4 编译测试
上面编译指令为最简单的编译指令,使用很简单,但是有一个问题,输出文件为lapi.exe文件而不是lua.exe,因为没有指定输出程序名称,可以使用-o文件进行指定输出文件名称。
::编译所有c文件并生成可执行文件,
::-o选项指定输出文件为lua.exe
tcc *.c -o lua.exe
上面编译命令虽然简单,但是隐藏了很多细节,下面进一步分析。
lua.c为解释器源码,如果直接编译lua.c文件则会出错,出错信息如下
tcc lua.c -o lua.exe

因为编译这个解释器需要链接到其他代码的信息。即所有c代码均要指出,如
::编译所有c代码,输出程序为lua.exe
::等价于tcc *.c -o lua.exe
tcc lapi.c lauxlib.c lbaselib.c lcode.c lcorolib.c lctype.c ldblib.c ldebug.c ldo.c ldump.c lfunc.c lgc.c linit.c liolib.c llex.c lmathlib.c lmem.c loadlib.c lobject.c lopcodes.c loslib.c lparser.c lstate.c lstring.c lstrlib.c ltable.c ltablib.c ltm.c lua.c lundump.c lutf8lib.c lvm.c lzio.c -o lua.exe
正常c语言程序包含编译和链接两个步骤,使用tcc编译和链接如下:
::编译所有c文件并生成obj文件,
::-c选项指定只编译不进行链接
tcc -c *.c
::将所有obj文件链接为可执行文件,-o选项指定输出文件为lua.exe
tcc *.o -o lua.exe
除了一次性编译所有c代码文件,还可以逐个编译c代码文件,再进行链接。
::逐个编译所有c文件并生成obj文件,
::-c选项指定只编译不进行链接
tcc -c lapi.c
tcc -c lauxlib.c
tcc -c lbaselib.c
tcc -c lcode.c
tcc -c lcorolib.c
tcc -c lctype.c
tcc -c ldblib.c
tcc -c ldebug.c
tcc -c ldo.c
tcc -c ldump.c
tcc -c lfunc.c
tcc -c lgc.c
tcc -c linit.c
tcc -c liolib.c
tcc -c llex.c
tcc -c lmathlib.c
tcc -c lmem.c
tcc -c loadlib.c
tcc -c lobject.c
tcc -c lopcodes.c
tcc -c loslib.c
tcc -c lparser.c
tcc -c lstate.c
tcc -c lstring.c
tcc -c lstrlib.c
tcc -c ltable.c
tcc -c ltablib.c
tcc -c ltm.c
tcc -c lua.c
tcc -c lundump.c
tcc -c lutf8lib.c
tcc -c lvm.c
tcc -c lzio.c
::将所有obj文件链接为可执行文件,-o选项指定输出文件为lua.exe
tcc *.o -o lua.exe
这样写的好处是当你修改某个c代码文件时可以,直接重新编译这个文件而其他未修改文件可以不编译,提高编译效率。
::若我们只修改了lua.c文件,不需编译其他文件,只需编译lua.c文件
tcc -c lua.c
::将所有obj文件链接为可执行文件,-o选项指定输出文件为lua.exe
tcc *.o -o lua.exe
此外还c语言开发中有两种特殊的编译方法,一个是生成静态链接库,如下
::编译除lua.c外所有c代码文件,生成静态链接库liblua.a
::-r代表重定向
tcc -r lapi.c lcode.c lctype.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c lmem.c lobject.c lopcodes.c lparser.c lstate.c lstring.c ltable.c ltm.c lundump.c lvm.c lzio.c lauxlib.c lbaselib.c lcorolib.c ldblib.c liolib.c lmathlib.c loslib.c lstrlib.c ltablib.c loadlib.c linit.c lutf8lib.c -o liblua.a::生成文件静态链接库liblua.a,
::编译生成lua(静态链接库版本).exe,需用到liblua.a文件
tcc liblua.a lua.c -o lua(静态链接库版本).exe
还有一种是生成动态链接库版本
::编译除lua.c外所有c代码文件,生成动态链接库lua.dll
tcc -shared -rdynamic lapi.c lcode.c lctype.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c lmem.c lobject.c lopcodes.c lparser.c lstate.c lstring.c ltable.c ltm.c lundump.c lvm.c lzio.c lauxlib.c lbaselib.c lcorolib.c ldblib.c liolib.c lmathlib.c loslib.c lstrlib.c ltablib.c loadlib.c linit.c lutf8lib.c -o lua.dll
::生成文件动态链接库lua.dll,以及导出函数表lua.def文件
::编译生成lua(动态链接库版本).exe,需用到lua.def文件
tcc lua.def lua.c -o lua(动态链接库版本).exe
5 小结
使用tcc来编译lua源代码还是比较简单的,一方面是tcc编译器使用比较简单容易上手,另一方面是lua源代码也比较简单没有其他第三方库依赖,而且所有源码位于同一文件夹方便编译。
相关文章:
tcc编译器教程2 编译lua解释器
本文主要介绍了使用tcc编译器编译lua解释器源码。 1 介绍 lua是一门编程语言,开源且源码很容易编译,我平时用来测试C语言编程环境时经常使用。一般能编译成功就说明编程环境设置正常。下面用之前设置好的tcc编程环境进行测试。 2 获取源码 我一般有保留多个版本的lua源码进…...
利用 requestrepo 工具验证 XML外部实体注入漏洞
1. 前言 在数字化浪潮席卷的当下,网络安全的重要性愈发凸显。应用程序在便捷生活与工作的同时,也可能暗藏安全风险。XXE(XML外部实体)漏洞作为其中的典型代表,攻击者一旦利用它,便能窃取敏感信息、掌控服务…...
在 Maven 中使用 <scope> 元素:全面指南
目录 前言 在 Maven 中, 元素用于定义依赖项的作用范围,即依赖项在项目生命周期中的使用方式。正确使用 可以帮助我们优化项目的构建过程,减少不必要的依赖冲突,并提高构建效率。本文将详细介绍 的使用步骤、常见作用范围、代码…...
uni_app实现下拉刷新
1. 在页面配置中启用下拉刷新 首先,你需要在页面的 pages.json 文件中启用下拉刷新功能。 {"pages": [{"path": "pages/index/index","style": {"navigationBarTitleText": "首页","enablePull…...
PCIe协议之RCB、MPS、MRRS详解
✨前言: PCIe总线的存储器写请求、存储器读完成等TLP中含有数据负载,即Data Payload。Data Payload的长度和MPS(Max Payload Size)、MRRS(Max Read Request Size)和RCB(Read Completion Bounda…...
达梦数据库在Linux,信创云 安装,备份,还原
(一)系统环境检查 1操作系统:确认使用的是国产麒麟操作系统,检查系统版本是否兼容达梦数据库 V8。可以通过以下命令查看系统版本: cat /etc/os-release 2硬件资源:确保服务器具备足够的硬件资源࿰…...
使用Dockerfile打包java项目生成镜像部署到Linux_java项目打docker镜像的dockerfile
比起容器、镜像来说,Dockerfile 非常普通,它就是一个纯文本,里面记录了一系列的构建指令,比如选择基础镜像、拷贝文件、运行脚本等等,每个指令都会生成一个 Layer,而 Docker 顺序执行这个文件里的所有步骤&…...
爬虫案例九js逆向爬取CBA中国篮球网
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、CBA网站分析二、代码 前言 提示:这里可以添加本文要记录的大概内容: 爬取CBA中国篮球网 提示:以下是本篇文章正文内容…...
【DeepSeek】Ubuntu快速部署DeepSeek(Ollama方式)
文章目录 人人都该学习的DeepSeekDeepSeek不同版本功能差异DeepSeek与硬件直接的关系DeepSeek系统兼容性部署方式选择部署步骤(Ollama方式)1.选定适合的deepseek版本2.环境准备3.安装Ollama4.部署deepseek5.测试使用 人人都该学习的DeepSeek DeepSeek 作…...
C++后端服务器开发技术栈有哪些?有哪些资源或开源库拿来用?
一、 C后台服务器开发是一个涉及多方面技术选择的复杂领域,特别是在高性能、高并发的场景下。以下是C后台服务器开发的一种常见技术路线,涵盖了从基础到高级的技术栈。 1. 基础技术栈 C标准库 C11/C14/C17/C20:使用现代C特性,如…...
基于SpringBoot的餐厅点餐管理系统设计与实现(源码+SQL脚本+LW+部署讲解等)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
服务端和客户端通信(TCP)
服务端 using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks;namespace TeachTcpServer {class Program{static void Main(string[] args){#region 知识点一 …...
Java 大视界 -- Java 大数据在智能体育赛事运动员表现分析与训练优化中的应用(122)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
基于Spring Boot的多级缓存架构实现
基于Spring Boot的多级缓存架构实现 以下是一个基于Spring Boot的多级缓存架构实现示例 多级缓存架构实现方案 1. 依赖配置(pom.xml) <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-star…...
Git与GitHub:理解两者差异及其关系
目录 Git与GitHub:理解两者差异及其关系Git:分布式版本控制系统概述主要特点 GitHub:基于Web的托管服务概述主要特点 Git和GitHub如何互补关系现代开发工作流 结论 Git与GitHub:理解两者差异及其关系 Git:分布式版本控…...
ALG(Alloy+Loki+Grafana)轻量级日志系统
ALG(AlloyLokiGrafana)轻量级日志系统 前提要求 GrafanaMinioNginxPrometheus Grafana日志收集系统旧版是PLG(ProtailLokiGrafana), Protail收集日志, Loki存储, Grafana展示, 后续的Protail不维护了, Grafana推出了Alloy代替Pritial, 除了收集日志外, 还集成管理Prometheus各种…...
【漫话机器学习系列】121.偏导数(Partial Derivative)
偏导数(Partial Derivative)详解 1. 引言 在数学分析、机器学习、物理学和工程学中,我们经常会遇到多个变量的函数。这些函数的输出不仅取决于一个变量,而是由多个变量共同决定的。那么,当其中某一个变量发生变化时&…...
Deepseek可以通过多种方式帮助CAD加速工作
自动化操作:通过Deepseek的AI能力,可以编写脚本来自动化重复性任务。例如,使用Python脚本调用Deepseek API,在CAD中实现自动化操作。 插件开发:结合Deepseek进行二次开发,可以创建自定义的CAD插件。例如&a…...
【工具使用】IDEA 社区版如何创建 Spring Boot 项目(详细教程)
IDEA 社区版如何创建 Spring Boot 项目(详细教程) Spring Boot 以其简洁、高效的特性,成为 Java 开发的主流框架之一。虽然 IntelliJ IDEA 专业版提供了Spring Boot 项目向导,但 社区版(Community Edition)…...
QT中串口打开按钮如何点击打开后又能点击关闭
前言: if (!portOpen) { // 打开串口 if (!sp18Controller->initializePort("COM5", 38400)) { QMessageBox::critical(this, "Error", "Failed to open serial port."); return; } ui->btnOpenPort_2->setText("Close…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
