使用CMake构建lua并嵌入C程序
Lua 是一个小巧的解释型语言,优点很明显:非常小,因此很适合嵌入一些编译型语言中,使之可拓展性大大增强。
但是网上许多文章都是基于 lua 5.1 ,而且不支持 Windows 平台,于是我 准备使用 CMake 弄一个全平台的。
如果不需要编译 lua 库文件,windows 下只需要把代码全拖进VS直接编译即可,但这样就不能使用MinGW编译了
获取 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
可以看到:
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
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下请自行配置工具链)
cd build-lua/build
cmake -DCMAKE_BUILD_TYPE=Release ..
make
尝试使用静态链接库
刚刚编译完了 lua 库,我们来试试使用 C语言调用 Lua 打印 Hello World
新建文件夹,编写 CMakeLists.txt
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
#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
print("123")
编译,运行