Windows 下使用 Mingw32 编译 Lua 5.4 源码

Windows 下使用 Mingw32 编译 Lua 5.4 源码

文章目录

下载 Lua 源码解压 Lua 5.4.0.tar.gz安装 Mingw执行 src/Makefilemake helpmake mingw生成:*.o, *.exe

使用编译好的 lua.exe 来执行脚本docs/readme.html

下载 Lua 源码

在 Lua/ftp 下载源码,这里我下载的是 Lua 5.4 的

解压 Lua 5.4.0.tar.gz

安装 Mingw

这里使用的是 mingw32 不是 64 的,需要 64位 的自行搜索下载

32位 的可以参考我之前一篇的:C - Book Note - Win 开发环境设置

执行 src/Makefile

在 windows 下如何执行 Makefile 的简单的方法,可以参考前一篇:Windows 下使用 Mingw32-make 来执行 Makefile示例

在解压后的目录 src 里,可以看到有 Makefile: Makefile 的内容如下:

# Makefile for building Lua

# See ../doc/readme.html for installation and customization instructions.

# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT =======================

# Your platform. See PLATS for possible values.

PLAT= guess

CC= gcc -std=gnu99

CFLAGS= -O2 -Wall -Wextra -DLUA_COMPAT_5_3 $(SYSCFLAGS) $(MYCFLAGS)

LDFLAGS= $(SYSLDFLAGS) $(MYLDFLAGS)

LIBS= -lm $(SYSLIBS) $(MYLIBS)

AR= ar rcu

RANLIB= ranlib

RM= rm -f

UNAME= uname

SYSCFLAGS=

SYSLDFLAGS=

SYSLIBS=

MYCFLAGS=

MYLDFLAGS=

MYLIBS=

MYOBJS=

# Special flags for compiler modules; -Os reduces code size.

CMCFLAGS= -Os

# == END OF USER SETTINGS -- NO NEED TO CHANGE ANYTHING BELOW THIS LINE =======

PLATS= guess aix bsd c89 freebsd generic linux linux-readline macosx mingw posix solaris

LUA_A= liblua.a

CORE_O= lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o

LIB_O= lauxlib.o lbaselib.o lcorolib.o ldblib.o liolib.o lmathlib.o loadlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o linit.o

BASE_O= $(CORE_O) $(LIB_O) $(MYOBJS)

LUA_T= lua

LUA_O= lua.o

LUAC_T= luac

LUAC_O= luac.o

ALL_O= $(BASE_O) $(LUA_O) $(LUAC_O)

ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T)

ALL_A= $(LUA_A)

# Targets start here.

default: $(PLAT)

all: $(ALL_T)

o: $(ALL_O)

a: $(ALL_A)

$(LUA_A): $(BASE_O)

$(AR) $@ $(BASE_O)

$(RANLIB) $@

$(LUA_T): $(LUA_O) $(LUA_A)

$(CC) -o $@ $(LDFLAGS) $(LUA_O) $(LUA_A) $(LIBS)

$(LUAC_T): $(LUAC_O) $(LUA_A)

$(CC) -o $@ $(LDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS)

test:

./lua -v

clean:

$(RM) $(ALL_T) $(ALL_O)

depend:

@$(CC) $(CFLAGS) -MM l*.c

echo:

@echo "PLAT= $(PLAT)"

@echo "CC= $(CC)"

@echo "CFLAGS= $(CFLAGS)"

@echo "LDFLAGS= $(SYSLDFLAGS)"

@echo "LIBS= $(LIBS)"

@echo "AR= $(AR)"

@echo "RANLIB= $(RANLIB)"

@echo "RM= $(RM)"

@echo "UNAME= $(UNAME)"

# Convenience targets for popular platforms.

ALL= all

help:

@echo "Do 'make PLATFORM' where PLATFORM is one of these:"

@echo " $(PLATS)"

@echo "See doc/readme.html for complete instructions."

guess:

@echo Guessing `$(UNAME)`

@$(MAKE) `$(UNAME)`

AIX aix:

$(MAKE) $(ALL) CC="xlc" CFLAGS="-O2 -DLUA_USE_POSIX -DLUA_USE_DLOPEN" SYSLIBS="-ldl" SYSLDFLAGS="-brtl -bexpall"

bsd:

$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN" SYSLIBS="-Wl,-E"

c89:

$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_C89" CC="gcc -std=c89"

@echo ''

@echo '*** C89 does not guarantee 64-bit integers for Lua.'

@echo ''

FreeBSD NetBSD OpenBSD freebsd:

$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX -DLUA_USE_READLINE -I/usr/include/edit" SYSLIBS="-Wl,-E -ledit" CC="cc"

generic: $(ALL)

Linux linux: linux-noreadline

linux-noreadline:

$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl"

linux-readline:

$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX -DLUA_USE_READLINE" SYSLIBS="-Wl,-E -ldl -lreadline"

Darwin macos macosx:

$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_MACOSX -DLUA_USE_READLINE" SYSLIBS="-lreadline"

mingw:

$(MAKE) "LUA_A=lua54.dll" "LUA_T=lua.exe" \

"AR=$(CC) -shared -o" "RANLIB=strip --strip-unneeded" \

"SYSCFLAGS=-DLUA_BUILD_AS_DLL" "SYSLIBS=" "SYSLDFLAGS=-s" lua.exe

$(MAKE) "LUAC_T=luac.exe" luac.exe

posix:

$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX"

SunOS solaris:

$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN -D_REENTRANT" SYSLIBS="-ldl"

# Targets that do not create files (not all makes understand .PHONY).

.PHONY: all $(PLATS) help test clean default o a depend echo

# Compiler modules may use special flags.

llex.o:

$(CC) $(CFLAGS) $(CMCFLAGS) -c llex.c

lparser.o:

$(CC) $(CFLAGS) $(CMCFLAGS) -c lparser.c

lcode.o:

$(CC) $(CFLAGS) $(CMCFLAGS) -c lcode.c

# DO NOT DELETE

lapi.o: lapi.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \

lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h lstring.h \

ltable.h lundump.h lvm.h

lauxlib.o: lauxlib.c lprefix.h lua.h luaconf.h lauxlib.h

lbaselib.o: lbaselib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h

lcode.o: lcode.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \

llimits.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h \

ldo.h lgc.h lstring.h ltable.h lvm.h

lcorolib.o: lcorolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h

lctype.o: lctype.c lprefix.h lctype.h lua.h luaconf.h llimits.h

ldblib.o: ldblib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h

ldebug.o: ldebug.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \

lobject.h ltm.h lzio.h lmem.h lcode.h llex.h lopcodes.h lparser.h \

ldebug.h ldo.h lfunc.h lstring.h lgc.h ltable.h lvm.h

ldo.o: ldo.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \

lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h lopcodes.h \

lparser.h lstring.h ltable.h lundump.h lvm.h

ldump.o: ldump.c lprefix.h lua.h luaconf.h lobject.h llimits.h lstate.h \

ltm.h lzio.h lmem.h lundump.h

lfunc.o: lfunc.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \

llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h

lgc.o: lgc.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \

llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h

linit.o: linit.c lprefix.h lua.h luaconf.h lualib.h lauxlib.h

liolib.o: liolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h

llex.o: llex.c lprefix.h lua.h luaconf.h lctype.h llimits.h ldebug.h \

lstate.h lobject.h ltm.h lzio.h lmem.h ldo.h lgc.h llex.h lparser.h \

lstring.h ltable.h

lmathlib.o: lmathlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h

lmem.o: lmem.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \

llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h

loadlib.o: loadlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h

lobject.o: lobject.c lprefix.h lua.h luaconf.h lctype.h llimits.h \

ldebug.h lstate.h lobject.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h \

lvm.h

lopcodes.o: lopcodes.c lprefix.h lopcodes.h llimits.h lua.h luaconf.h

loslib.o: loslib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h

lparser.o: lparser.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \

llimits.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h \

ldo.h lfunc.h lstring.h lgc.h ltable.h

lstate.o: lstate.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \

lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h llex.h \

lstring.h ltable.h

lstring.o: lstring.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \

lobject.h llimits.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h

lstrlib.o: lstrlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h

ltable.o: ltable.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \

llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h lstring.h ltable.h lvm.h

ltablib.o: ltablib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h

ltm.o: ltm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \

llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h lstring.h ltable.h lvm.h

lua.o: lua.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h

luac.o: luac.c lprefix.h lua.h luaconf.h lauxlib.h ldebug.h lstate.h \

lobject.h llimits.h ltm.h lzio.h lmem.h lopcodes.h lopnames.h lundump.h

lundump.o: lundump.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \

lobject.h llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lstring.h lgc.h \

lundump.h

lutf8lib.o: lutf8lib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h

lvm.o: lvm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \

llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lstring.h \

ltable.h lvm.h ljumptab.h

lzio.o: lzio.c lprefix.h lua.h luaconf.h llimits.h lmem.h lstate.h \

lobject.h ltm.h lzio.h

# (end of Makefile)

make help

在 Makefile 下,可以看到有:help 标签,我们可以执行:make help 来查看帮助信息

在输出的帮助信息中,可以看到一句:

"Do 'make PLATFORM' where PLATFORM is one of these."

意思只要执行:make PLATFORM 即可,而 PLATFORM 目前能支持的有后续列出来的几个平台: " guess aix bsd c89 freebsd generic linux linux-readline macosx mingw posix solaris"

make mingw

这里选用:mingw,所以继续执行:make mingw

输出内容如下:

PS C:\Users\jave\Downloads\lua-5.4.0\src> make mingw

C:/MinGW/bin/make "LUA_A=lua54.dll" "LUA_T=lua.exe" \

"AR=gcc -std=gnu99 -shared -o" "RANLIB=strip --strip-unneeded" \

"SYSCFLAGS=-DLUA_BUILD_AS_DLL" "SYSLIBS=" "SYSLDFLAGS=-s" lua.exe

make[1]: Entering directory 'C:/Users/jave/Downloads/lua-5.4.0/src'

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lua.o lua.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lapi.o lapi.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -Os -c lcode.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lctype.o lctype.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o ldebug.o ldebug.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o ldo.o ldo.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o ldump.o ldump.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lfunc.o lfunc.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lgc.o lgc.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -Os -c llex.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lmem.o lmem.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lobject.o lobject.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lopcodes.o lopcodes.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -Os -c lparser.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lstate.o lstate.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lstring.o lstring.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o ltable.o ltable.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o ltm.o ltm.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lundump.o lundump.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lvm.o lvm.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lzio.o lzio.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lauxlib.o lauxlib.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lbaselib.o lbaselib.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lcorolib.o lcorolib.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o ldblib.o ldblib.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o liolib.o liolib.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lmathlib.o lmathlib.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o loadlib.o loadlib.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o loslib.o loslib.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lstrlib.o lstrlib.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o ltablib.o ltablib.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o lutf8lib.o lutf8lib.c

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -DLUA_BUILD_AS_DLL -c -o linit.o linit.c

gcc -std=gnu99 -shared -o lua54.dll lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o lauxlib.o lbaselib.o lcorolib.o ldblib.o liolib.o lmathlib.o loadlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o linit.o

strip --strip-unneeded lua54.dll

gcc -std=gnu99 -o lua.exe -s lua.o lua54.dll -lm

make[1]: Leaving directory 'C:/Users/jave/Downloads/lua-5.4.0/src'

C:/MinGW/bin/make "LUAC_T=luac.exe" luac.exe

make[1]: Entering directory 'C:/Users/jave/Downloads/lua-5.4.0/src'

gcc -std=gnu99 -O2 -Wall -Wextra -DLUA_COMPAT_5_3 -c -o luac.o luac.c

ar rcu liblua.a lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o lauxlib.o lbaselib.o lcorolib.o ldblib.o liolib.o lmathlib.o loadlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o linit.o

ranlib liblua.a

gcc -std=gnu99 -o luac.exe luac.o liblua.a -lm

make[1]: Leaving directory 'C:/Users/jave/Downloads/lua-5.4.0/src'

留意最后一句:make[1]: Leaving directory 'C:/Users/jave/Downloads/lua-5.4.0/src'

生成:*.o, *.exe

可以看到有一堆的 *.o,还有两个:*.exe

lua.exe 是解析器,可以执行文本信息的 lua 脚本luac.exe 可以用来编译 lua 脚本输出为:xxx.out 的内容,然后在用 lua xxx.out 也是可以执行对应的 lua 脚本逻辑的内容

使用编译好的 lua.exe 来执行脚本

可以看到 Hello World! 已经正常打印了

docs/readme.html

其实在我们之前的:make help,也有提示查看:doc/readme.html 的文档内容 该文档有很详细的介绍:

Installing Lua - 如何安装 luaBuilding Lua - 如何构建 lua(也就是上面我们编译 lua 源码的内容)Customization - 如何通过修改 src/luaconf.lua 来定制 lua 特性Building Lua on other systems - 基于其他系统构建 lua

相关推荐

全面解析:组装一台电脑的费用究竟是多少?
《王者荣耀》暃埋骨钱新皮肤获取价格
365速发在线注册

《王者荣耀》暃埋骨钱新皮肤获取价格

⌛ 06-28 👁️ 5157
休赛期交易什么时候开始?2025年NBA交易窗口、关键日期与重磅动向解析