跳到主要内容

使用CMake构建lua并嵌入C程序

· 阅读需 4 分钟
Skyone

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_OLIB_O 里的(把 .o 换成 .c)以及 lua.c

lua 编译器依赖 CORE_OLIB_O 里的(把 .o 换成 .c)以及 luac.c

lua 库依赖 CORE_OLIB_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

compile

尝试使用静态链接库

刚刚编译完了 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")

编译,运行

run