LUAJIT官方源码编译调试

LUAJIT官方源码编译调试

项目地址:https://luajit.org/download.html

镜像仓库:https://github.com/LuaJIT/LuaJIT

搭建Visual Studio工程

这里我用的是VS 2022

1、先进入x64 Native Tools Command Prompt for VS 2022,执行一遍msvcbuild.bat,成功编译出luajit.exe

2、修改msvcbuild.bat脚本,移除掉里面的删除obj缓存相关内容,重新执行一遍吧

1
2
3
@del *.obj *.manifest minilua.exe buildvm.exe
@del host\buildvm_arch.h
@del lj_bcdef.h lj_ffdef.h lj_libdef.h lj_recdef.h lj_folddef.h

3、src目录下建个工程,拖入所有的源码,编译提示一大堆函数已被重复定义

1
2
3
4
5
6
7
8
9
1>ljamalg.obj : error LNK2005: luaopen_base 已经在 lib_base.obj 中定义
1>ljamalg.obj : error LNK2005: luaopen_math 已经在 lib_math.obj 中定义
1>ljamalg.obj : error LNK2005: luaopen_string 已经在 lib_string.obj 中定义
1>ljamalg.obj : error LNK2005: luaopen_table 已经在 lib_table.obj 中定义
1>ljamalg.obj : error LNK2005: luaopen_io 已经在 lib_io.obj 中定义
1>ljamalg.obj : error LNK2005: luaopen_os 已经在 lib_os.obj 中定义
1>ljamalg.obj : error LNK2005: luaopen_package 已经在 lib_package.obj 中定义
1>ljamalg.obj : error LNK2005: luaopen_debug 已经在 lib_debug.obj 中定义
1>ljamalg.obj : error LNK2005: luaopen_bit 已经在 lib_bit.obj 中定义

移除ljamalg.c文件即可

4、继续编译,又会报错,缺少lj_vm.obj,将其添加到链接器的附加依赖项中

Windows下编译Android

来个ARM64编译bat,需要使用x64 Native Tools Command Prompt工具

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
@if not defined INCLUDE goto :FAIL_ENV

@rem ========================================================================
@rem 1. 环境准备与路径配置
@rem ========================================================================
@setlocal
@echo [INFO] Initializing environment...

@rem 获取当前脚本所在目录(src)
@set "LJ_SRC_DIR=%~dp0"
@if "%LJ_SRC_DIR:~-1%"=="\" set "LJ_SRC_DIR=%LJ_SRC_DIR:~0,-1%"
@set "LJ_HOST_DIR=%LJ_SRC_DIR%\host"
@set "DASM_DIR=%LJ_SRC_DIR%\..\dynasm"

@echo [INFO] Source Dir: %LJ_SRC_DIR%

@rem ========================================================================
@rem 2. NDK 工具链配置 (请根据实际情况修改 NDK_ROOT)
@rem ========================================================================
@if not defined NDK_ROOT set "NDK_ROOT=C:\Users\fjqisba\AppData\Local\Android\Sdk\ndk\26.0.10792818"
@set "NDK_TOOLCHAIN=%NDK_ROOT%\toolchains\llvm\prebuilt\windows-x86_64"
@set "ANDROID_API=21"
@set "ANDROID_TARGET=aarch64-linux-android"

@rem 注意:NDK的clang通常是.cmd脚本,必须使用 call 调用
@set "ANDROID_CC=%NDK_TOOLCHAIN%\bin\%ANDROID_TARGET%%ANDROID_API%-clang.cmd"
@set "ANDROID_AR=%NDK_TOOLCHAIN%\bin\llvm-ar.exe"
@set "ANDROID_STRIP=%NDK_TOOLCHAIN%\bin\llvm-strip.exe"

@rem ========================================================================
@rem 3. 编译参数配置
@rem ========================================================================
@rem Host (Windows MSVC) 编译参数
@set LJCOMPILE=cl /nologo /c /MD /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE /I "%LJ_SRC_DIR%"
@set LJLINK=link /nologo

@rem Host DynASM 参数 (针对 ARM64)
@set DASC=vm_arm64.dasc
@set DASMFLAGS=-D ENDIAN_LE -D FFI -D JIT -D FPU -D P64

@rem Target (Android ARM64) 编译参数
@rem 注意:LUAJIT_OS_LINUX 通常对应数字 2,但使用宏更清晰
@set TARGET_CFLAGS=-O2 -fPIC -fno-strict-aliasing -Wall -DLUAJIT_TARGET=LUAJIT_ARCH_ARM64 -DLUAJIT_OS=LUAJIT_OS_LINUX -D__ANDROID__
@set TARGET_LDFLAGS=-lm -ldl

@rem 需要编译的库文件列表 (LuaJIT 2.1 包含 lib_buffer.c)
@set ALL_LIB=lib_base.c lib_math.c lib_bit.c lib_string.c lib_table.c lib_io.c lib_os.c lib_package.c lib_debug.c lib_jit.c lib_ffi.c lib_buffer.c

@rem ========================================================================
@rem 4. 清理旧文件
@rem ========================================================================
@echo [INFO] Cleaning up...
@cd /d "%LJ_SRC_DIR%"
@del *.o *.obj *.lib *.exp *.dll *.exe *.a *.so 2>nul
@del host\*.obj host\*.exe 2>nul
@del lj_bcdef.h lj_ffdef.h lj_libdef.h lj_recdef.h lj_folddef.h lj_vm.S 2>nul

@rem ========================================================================
@rem 5. 宿主编译: minilua
@rem ========================================================================
@echo [INFO] Compiling Host Tool: minilua...
%LJCOMPILE% host\minilua.c /Fo"host\minilua.obj"
@if errorlevel 1 goto :FAIL
%LJLINK% /out:minilua.exe host\minilua.obj
@if errorlevel 1 goto :FAIL

@rem ========================================================================
@rem 6. 宿主运行: 处理 dynasm 生成 buildvm_arch.h
@rem ========================================================================
@echo [INFO] Generating buildvm_arch.h using minilua...
@if not exist "%DASM_DIR%\dynasm.lua" (
@echo [ERROR] Cannot find dynasm.lua at %DASM_DIR%
goto :FAIL
)
minilua "%DASM_DIR%\dynasm.lua" -LN %DASMFLAGS% -o host\buildvm_arch.h %DASC%
@if errorlevel 1 goto :FAIL

@rem ========================================================================
@rem 7. 宿主编译: buildvm
@rem ========================================================================
@echo [INFO] Compiling Host Tool: buildvm...
@rem buildvm 需要包含 buildvm_arch.h 以及指定目标架构
%LJCOMPILE% /I "%DASM_DIR%" /I "%LJ_HOST_DIR%" -DLUAJIT_TARGET=LUAJIT_ARCH_ARM64 -DLUAJIT_OS=LUAJIT_OS_LINUX host\buildvm*.c /Fo"host\\"
@if errorlevel 1 goto :FAIL
%LJLINK% /out:buildvm.exe host\buildvm*.obj
@if errorlevel 1 goto :FAIL

@rem ========================================================================
@rem 8. 宿主运行: buildvm 生成核心代码
@rem ========================================================================
@echo [INFO] Running buildvm to generate Core Sources...
buildvm -m elfasm -o lj_vm.S
buildvm -m bcdef -o lj_bcdef.h %ALL_LIB%
buildvm -m ffdef -o lj_ffdef.h %ALL_LIB%
buildvm -m libdef -o lj_libdef.h %ALL_LIB%
buildvm -m recdef -o lj_recdef.h %ALL_LIB%
buildvm -m vmdef -o jit\vmdef.lua %ALL_LIB%
buildvm -m folddef -o lj_folddef.h lj_opt_fold.c
@if errorlevel 1 goto :FAIL

@rem ========================================================================
@rem 9. 目标编译: 汇编核心 (lj_vm.S)
@rem ========================================================================
@echo [INFO] Compiling Android ARM64 ASM (lj_vm.S)...
@rem 注意:Windows下生成的文件名为 lj_vm.S (大写S),Clang 编译时需要 -x assembler
call "%ANDROID_CC%" -c -x assembler %TARGET_CFLAGS% -o lj_vm.o lj_vm.S
@if errorlevel 1 goto :FAIL

@rem ========================================================================
@rem 10. 目标编译: C 源码 (核心库)
@rem ========================================================================
@echo [INFO] Compiling Android ARM64 C Sources...
call "%ANDROID_CC%" -c %TARGET_CFLAGS% lj_*.c lib_*.c
@if errorlevel 1 goto :FAIL

@rem ========================================================================
@rem 11. 目标编译: LuaJIT 可执行程序入口
@rem ========================================================================
@echo [INFO] Compiling Main Executable Entry...
call "%ANDROID_CC%" -c %TARGET_CFLAGS% luajit.c -o luajit.o
@if errorlevel 1 goto :FAIL

@rem ========================================================================
@rem 12. 链接生成库和可执行文件
@rem ========================================================================
@echo [INFO] Linking...

@rem A. 静态库 (.a)
@echo [INFO] Creating static library: libluajit.a
call "%ANDROID_AR%" rcs libluajit.a lj_*.o lib_*.o
@if errorlevel 1 goto :FAIL

@rem B. 动态库 (.so)
@echo [INFO] Creating shared library: libluajit.so
call "%ANDROID_CC%" -shared -o libluajit.so lj_*.o lib_*.o %TARGET_LDFLAGS%
@if errorlevel 1 goto :FAIL
call "%ANDROID_STRIP%" --strip-unneeded libluajit.so

@rem C. 可执行文件 (luajit)
@echo [INFO] Creating executable: luajit_android_arm64
call "%ANDROID_CC%" -o luajit_android_arm64 luajit.o libluajit.a %TARGET_LDFLAGS% -pie
@if errorlevel 1 goto :FAIL

@rem ========================================================================
@rem 完成
@rem ========================================================================
@echo.
@echo [SUCCESS] Build complete!
@echo Static Lib: %LJ_SRC_DIR%\libluajit.a
@echo Shared Lib: %LJ_SRC_DIR%\libluajit.so
@echo Executable: %LJ_SRC_DIR%\luajit_android_arm64
@goto :END

:FAIL_ENV
@echo [ERROR] Please run this from "x64 Native Tools Command Prompt" for VS.
@goto :END

:FAIL
@echo.
@echo [ERROR] Build failed! Please check the error messages above.
@exit /b 1

:END
@endlocal

LUAJIT官方源码编译调试
https://fjqisba.github.io/2026/01/24/2026/LUAJIT官方源码编译调试/
作者
fjqisba
发布于
2026年1月25日
许可协议
MIT