Lua 是一个小巧的解释型语言,优点很明显:非常小,因此很适合嵌入一些编译型语言中,使之可拓展性大大增强。
但是网上许多文章都是基于 lua 5.1 ,而且不支持 Windows 平台,于是我准备使用 CMake 弄一个全平台的。
如果不需要编译 lua 库文件,windows 下只需要把代码全拖进VS直接编译即可,但这样就不能使用MinGW编译了,而我一般使用CLion~
获取 Lua 源代码
Lua 源代码可以从其 官网 下载,我使用的是 lua-5.4.3
这一步想必不用多说,总之把这东西下载下来: https://www.lua.org/ftp/lua-5.4.3.tar.gz
把下载的压缩包解压,然后找一个空的文件夹,例如 build-lua
把解压出的文件夹中的 src
目录整个复制到 build-lua/src
编写 CMakeLists.txt
这一步简单来说就是组织一下 Lua 的依赖嘛,我们先看看官方的 makefile 怎么写的,打开 build/src/Makefile
可以看到:
1 2 3 4 5 6 7 8 9 10
| 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
|
依赖关系已经很明确了吧
lua 解释器依赖 CORE_O
、 LIB_O
里的(把 .o
换成 .c
)以及 lua.c
lua 编译器依赖 CORE_O
、 LIB_O
里的(把 .o
换成 .c
)以及 luac.c
lua 库依赖 CORE_O
、 LIB_O
接下来就是写 CMakeLists.txt
了,我写好了一份放在 skyone-wzw/b40164a62e58492425a40c990c93e440
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
| project(lua C) cmake_minimum_required(VERSION 3.16)
set(src_code src/lapi.c src/lcode.c src/lctype.c src/ldebug.c src/ldo.c src/ldump.c src/lfunc.c src/lgc.c src/llex.c src/lmem.c src/lobject.c src/lopcodes.c src/lparser.c src/lstate.c src/lstring.c src/ltable.c src/ltm.c src/lundump.c src/lvm.c src/lzio.c) set(src_lib src/lauxlib.c src/lbaselib.c src/lcorolib.c src/ldblib.c src/liolib.c src/lmathlib.c src/loadlib.c src/loslib.c src/lstrlib.c src/ltablib.c src/lutf8lib.c src/linit.c)
set(src_exec src/lua.c) set(src_comp src/luac.c)
add_library(liblua_static STATIC ${src_code} ${src_lib}) set_target_properties(liblua_static PROPERTIES OUTPUT_NAME lua)
add_library(liblua_share SHARED ${src_code} ${src_lib}) set_target_properties(liblua_share PROPERTIES OUTPUT_NAME lua)
add_executable(lua ${src_code} ${src_lib} ${src_exec}) set_target_properties(lua PROPERTIES OUTPUT_NAME lua)
add_executable(luac ${src_code} ${src_lib} ${src_comp}) set_target_properties(luac PROPERTIES OUTPUT_NAME luac)
|
使用CMake构建
一切准备就绪,开始构建吧!
先新建一个文件夹 build-lua/build
用来存放构建文件,在其中执行(Windows下请自行配置工具链)
1 2 3 4 5
| cd build-lua/build
cmake -DCMAKE_BUILD_TYPE=Release ..
make
|
尝试使用静态链接库
刚刚编译完了 lua 库,我们来试试使用 C语言调用 Lua 打印 Hello World
新建文件夹,编写 CMakeLists.txt
1 2 3 4 5 6 7 8 9 10
| cmake_minimum_required(VERSION 3.16) project(run_lua C)
set(CMAKE_C_STANDARD 99)
include_directories(${path_to_lua_source_code})
add_executable(run_lua main.c)
target_link_libraries(run_lua ${path_to_lua_lib}/liblua.a)
|
主函数 main.c
1 2 3 4 5 6 7 8 9 10 11
| #include <lua.h> #include <lualib.h> #include <lauxlib.h>
int main() { lua_State *L = luaL_newstate(); luaL_openlibs(L); luaL_dofile(L, "main.lua");
return 0; }
|
Lua 脚本 main.lua
编译,运行
