用TCC在Windows下编译Lua5.3.4

作者在 2018-03-23 15:04:11 发布以下内容

最新的Lua版本是5.3.4,网上能找到的编译过的版本有这么几种:

1、Lua5.3.4源码

2、用新版MinGW-w32/w64编译的Lua5.3.4,只有exe文件,没有链接库,同时MinGW必须带上libgcc_s_dw2-1.dll这么一个库,用起来比较麻烦

3、用TCC编译并压缩过的Lua5.3.4,只有64K大,但也没链接库

因此,我想重新编译源码,生成动态/静态链接库及exe文件。因为最近在学习TCC,而TCC是是标准的C99,所以试着用TCC(0.9.27)来编译。以下默认TCC已经安装好(其实就是解压TCC到某个文件夹,并设置环境变量)。

1、下载Lua源码,解压,放在某个文件夹,这里假设是C:\lua

2、进入C:\lua,建立一个批处理文件make4tcc.bat,内容如下:

md bin
md include

cd src
tcc -shared -rdynamic -o lua.dll 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 lbitlib.c lcorolib.c ldblib.c liolib.c lmathlib.c loslib.c lstrlib.c ltablib.c loadlib.c linit.c lutf8lib.c
tcc -r -o liblua.a 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 lbitlib.c lcorolib.c ldblib.c liolib.c lmathlib.c loslib.c lstrlib.c ltablib.c loadlib.c linit.c lutf8lib.c

tcc -o lua.exe lua.def lua.c
tcc -o luac.exe liblua.a luac.c

copy *.exe ..\bin
copy lua.dll ..\bin
copy liblua.a ..\bin
copy *.h ..\include
3、运行make4tcc.bat


生成完毕,bin文件夹中是lua.exe luac.exe,以及动态链接库lua.dll和静态链接库liblua.a,include文件夹中是所有的头文件。

注意:编译luac必须使用静态链接库,使用动态链接库会出错,如果必须使用动态链接,请使用TCC0.9.26这个版本。这不是TCC的问题,其他编译器如GCC也会出现这个问题,不知是什么原因。

Tiny C | 阅读 2681 次
文章评论,共1条
介八雄至(游客)
2020-04-20 14:59
1
@echo off
cd src

tcc -o ..\luac.exe 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 luac.c ^
       lauxlib.c lbaselib.c lcorolib.c ldblib.c liolib.c ^
       lmathlib.c loslib.c lstrlib.c ltablib.c lutf8lib.c loadlib.c linit.c

tcc -DLUA_BUILD_AS_DLL -shared -o ..\lua.dll 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 lutf8lib.c loadlib.c linit.c
cd ..
tcc -o lua.exe src\lua.c lua.def

用预编译开关-DLUA_BUILD_AS_DLL使 lua.dll只包含需要输出的api,luac用到了内部api,所以不能连接lua.dll,如果不用预编译开关-DLUA_BUILD_AS_DLL而使用-rdynamic,lua.dll包含很多内部api,luac.exe可以用动态连接,但显然lua.dll输出内部api不合适。
游客请输入验证码
浏览37525次
最新评论