当前位置: 首页 > news >正文

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硬件资源:确保服务器具备足够的硬件资源&#xff0…...

使用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. 依赖配置&#xff08;pom.xml&#xff09; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-star…...

Git与GitHub:理解两者差异及其关系

目录 Git与GitHub&#xff1a;理解两者差异及其关系Git&#xff1a;分布式版本控制系统概述主要特点 GitHub&#xff1a;基于Web的托管服务概述主要特点 Git和GitHub如何互补关系现代开发工作流 结论 Git与GitHub&#xff1a;理解两者差异及其关系 Git&#xff1a;分布式版本控…...

ALG(Alloy+Loki+Grafana)轻量级日志系统

ALG(AlloyLokiGrafana)轻量级日志系统 前提要求 GrafanaMinioNginxPrometheus Grafana日志收集系统旧版是PLG(ProtailLokiGrafana), Protail收集日志, Loki存储, Grafana展示, 后续的Protail不维护了, Grafana推出了Alloy代替Pritial, 除了收集日志外, 还集成管理Prometheus各种…...

【漫话机器学习系列】121.偏导数(Partial Derivative)

偏导数&#xff08;Partial Derivative&#xff09;详解 1. 引言 在数学分析、机器学习、物理学和工程学中&#xff0c;我们经常会遇到多个变量的函数。这些函数的输出不仅取决于一个变量&#xff0c;而是由多个变量共同决定的。那么&#xff0c;当其中某一个变量发生变化时&…...

Deepseek可以通过多种方式帮助CAD加速工作

自动化操作&#xff1a;通过Deepseek的AI能力&#xff0c;可以编写脚本来自动化重复性任务。例如&#xff0c;使用Python脚本调用Deepseek API&#xff0c;在CAD中实现自动化操作。 插件开发&#xff1a;结合Deepseek进行二次开发&#xff0c;可以创建自定义的CAD插件。例如&a…...

【工具使用】IDEA 社区版如何创建 Spring Boot 项目(详细教程)

IDEA 社区版如何创建 Spring Boot 项目&#xff08;详细教程&#xff09; Spring Boot 以其简洁、高效的特性&#xff0c;成为 Java 开发的主流框架之一。虽然 IntelliJ IDEA 专业版提供了Spring Boot 项目向导&#xff0c;但 社区版&#xff08;Community Edition&#xff09…...

QT中串口打开按钮如何点击打开后又能点击关闭

前言&#xff1a; if (!portOpen) { // 打开串口 if (!sp18Controller->initializePort("COM5", 38400)) { QMessageBox::critical(this, "Error", "Failed to open serial port."); return; } ui->btnOpenPort_2->setText("Close…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术&#xff0c;通过密码学、共识机制和智能合约等核心组件&#xff0c;实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点&#xff1a;数据存储在网络中的多个节点&#xff08;计算机&#xff09;&#xff0c;而非…...