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源代碼也比較簡單沒有其他第三方庫依賴,而且所有源碼位于同一文件夾方便編譯。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/71871.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/71871.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/71871.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Unity DOTS從入門到精通之 自定義Authoring類

文章目錄 前言安裝 DOTS 包什么是Authoring1. 實體組件2. Authoring類 前言 DOTS(面向數據的技術堆棧)是一套由 Unity 提供支持的技術,用于提供高性能游戲開發解決方案,特別適合需要處理大量數據的游戲,例如大型開放世…

comctl32!ListView_OnSetItem函數分析LISTSUBITEM結構中的image表示圖標位置

第一部分: BOOL ListView_SetSubItem(LV* plv, const LV_ITEM* plvi) { LISTSUBITEM lsi; BOOL fChanged FALSE; int i; int idpa; HDPA hdpa; if (plvi->mask & ~(LVIF_DI_SETITEM | LVIF_TEXT | LVIF_IMAGE | LVIF_STATE)) { …

【算法】大數據查重

大數據查重 哈希表 找出第一個出現重復的數字 || 找所有重復出現的數字 #include <iostream> #include <vector> #include <unordered_map> #include <unordered_set> #include <stdlib.h> #include <time.h> #include <string> …

模型微調-基于LLaMA-Factory進行微調的一個簡單案例

模型微調-基于LLaMA-Factory進行微調的一個簡單案例 1. 租用云計算資源2. 拉取 LLaMa-Factory3. 安裝依賴環境4. 啟動 LLaMa-Factory 界面5. 從 Huggingface 下載模型6. 模型驗證7. 模型微調 1. 租用云計算資源 以下示例基于 AutoDL 云計算資源。 在云計算平臺選擇可用的云計…

【單片機】ARM 處理器簡介

ARM 公司簡介 ARM&#xff08;Advanced RISC Machine&#xff09; 是英國 ARM 公司&#xff08;原 Acorn RISC Machine&#xff09; 開發的一種精簡指令集&#xff08;RISC&#xff09; 處理器架構。ARM 處理器因其低功耗、高性能、廣泛適用性&#xff0c;成為嵌入式系統、移動…

springboot的實體類字段校驗的分組校驗

分組校驗&#xff08;Group Validation&#xff09;允許在不同的場景下對同一個實體類應用不同的校驗規則。例如&#xff0c;在新增數據和更新數據時&#xff0c;可能需要對某些字段的校驗規則進行調整。以下是分組校驗的具體實現步驟&#xff1a; 一、定義分組接口 創建空的標…

vue3,Element Plus中隱藏樹el-tree滾動條

el-tree&#xff0c;節點過多&#xff0c;默認會出現垂直滾動條&#xff0c;顯得不美觀 可以使用隱藏組件 el-scrollbar 將 el-tree 包裹&#xff0c;就可以隱藏垂直滾動條 <el-scrollbar> <el-tree> ... </el-tree> </el-scrollbar> /* 滾動條禁用鼠…

mysql練習

創建數據庫db_ck&#xff0c;再創建表t_hero&#xff0c;將四大名著中的主要人物都插入這個表中&#xff0c;將實現過程中sql提交上上來 1、創建數據庫db_ck mysql> create database db_ck; 2、創建表t_hero mysql> use db_ck Database changed mysql> create table …

svn刪除所有隱藏.svn文件,文件夾脫離svn控制

新建一個文件&#xff0c;取名remove-svn-folders.reg&#xff0c;輸入如下內容&#xff1a; Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN] "Delete SVN Folders" [HKEY_LOCAL_MACHINE\SOFTWARE\Class…

文心一言:中國大模型時代的破局者與探路者

2023年&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;的浪潮席卷全球&#xff0c;而百度推出的“文心一言”&#xff08;ERNIE Bot&#xff09;作為中國AI領域的代表性產品&#xff0c;迅速成為行業焦點。這款基于百度自主研發的“文心大模型”打造的對話式AI工具&am…

Ubuntu 安裝docker docker-compose

Docker 通過提供輕量級、可移植且高效的解決方案&#xff0c;簡化了軟件開發和部署。“docker build”命令是 Docker 鏡像創建過程的核心。本文將探討 Docker 構建命令、用法以及 Docker 構建的優化。 Docker 構建有什么作用&#xff1f; Docker build 是一個命令行界面 CLI命…

Unity開發——CanvasGroup組件介紹和應用

CanvasGroup是Unity中用于控制UI的透明度、交互性和渲染順序的組件。 一、常用屬性的解釋 1、alpha&#xff1a;控制UI的透明度 類型&#xff1a;float&#xff0c;0.0 ~1.0&#xff0c; 其中 0.0 完全透明&#xff0c;1.0 完全不透明。 通過調整alpha值可以實現UI的淡入淡…

每天五分鐘深度學習PyTorch:向更深的卷積神經網絡挑戰的ResNet

本文重點 ResNet大名鼎鼎,它是由何愷明團隊設計的,它獲取了2015年ImageNet冠軍,它很好的解決了當神經網絡層數過多出現的難以訓練的問題,它創造性的設計了跳躍連接的方式,使得卷積神經網絡的層數出現了大幅度提升,設置可以達到上千層,可以說resnet對于網絡模型的設計具…

大模型巔峰對決:DeepSeek vs GPT-4/Claude/PaLM-2 全面對比與核心差異揭秘

文章目錄 一、架構設計深度解剖1.1 核心架構對比圖譜1.2 動態MoE架構實現架構差異分析表 二、訓練策略全面對比2.1 訓練數據工程對比2.2 分布式訓練代碼對比DeepSeek混合并行實現GPT-4 Megatron實現對比 2.3 關鍵訓練參數對比 三、性能表現多維評測3.1 基準測試全景對比3.2 推理…

基于hive的電信離線用戶的行為分析系統

標題:基于hive的電信離線用戶的行為分析系統 內容:1.摘要 隨著電信行業的快速發展&#xff0c;用戶行為數據呈現出海量、復雜的特點。為了深入了解用戶行為模式&#xff0c;提升電信服務質量和精準營銷能力&#xff0c;本研究旨在構建基于 Hive 的電信離線用戶行為分析系統。通…

Python使用alembic實現數據庫管理

python使用alembic實現數據庫管理 環境準備 安裝依賴&#xff1a; pip install sqlalchemy alembic項目結構 my_project/ ├── models.py # 定義數據模型 └── alembic/ # 遷移腳本目錄&#xff08;自動生成&#xff09; 使用步驟&#xff1a; 1. 初始化Alembic環境 …

對WebSocket做一點簡單的理解

1.概念 WebSocket 是基于 TCP 的一種新的網絡協議。它實現了瀏覽器與服務器全雙工通信——瀏覽器和服務器只需要完成一次握手&#xff0c;兩者之間就可以創建持久性的連接&#xff0c; 并進行雙向數據傳輸。 HTTP協議和WebSocket協議對比&#xff1a; HTTP是短連接 WebSocke…

kali虛擬機登錄頁面發癲 大寫鎖定輸入不了密碼

不知道怎么了 總是發癲 重啟切換太麻煩了 還有時候不成功 kali其實可以開啟虛擬鍵盤 如下 就解決的 發癲kali 發癲 發癲

基于Python的商品銷量的數據分析及推薦系統

一、研究背景及意義 1.1 研究背景 隨著電子商務的快速發展&#xff0c;商品銷售數據呈現爆炸式增長。這些數據中蘊含著消費者行為、市場趨勢、商品關聯等有價值的信息。然而&#xff0c;傳統的數據分析方法難以處理海量、多源的銷售數據&#xff0c;無法滿足現代電商的需求。…

內存泄漏出現的時機和原因,如何避免?

由于時間比較緊張我就不排版了&#xff0c;但是對于每一種可能的情況都會出對應的代碼示例以及解決方案代碼示例。 內存泄漏可能的原因之一在于用戶在動態分配一個內存空間之中&#xff0c;忘記將這部分內容手動釋放。例如&#xff1a;&#xff08;c之中使用new分配內存沒有使…