本文旨在window平台下利用VS2019/2022 编译lua源码生成 lua编译器和解释器,并配置环境变量。同时为了便于在C++中嵌入lua的开发工作,也会生成VS能使用的dll、lib格式的lua动态链接库。
如果你只想生成window平台能使用的lua编译器,可以尝试下载mingw,通过make指令生成。需要注意的是通过这种方法只能生成.a格式的链接库,无法供VS开发使用。

默认你已下载好lua 5.4.x版本的源码。源码目录结构如下:
在这里插入图片描述

首先新建VS解决方案,方案名称随意,项目名字命名为lua,项目模板空项目,我们将利用这个项目生成lua解释器。
在解决方案中添加两个新项目,项目名分别为liblua(和官方统一)和luac。现在你有三个项目,一个是lua:负责生成lua解释器,一个是liblua:负责生成lua库,最后一个是luac:负责生成lua编译器,三个项目中目前都没有文件。
在这里插入图片描述
将之前下载好的lua源码中的src文件拷贝到解决方案根目录下。

选中liblua项目,添加现有项,把src文件夹下除了lua.c、luac.c这两个文件都添加进项目中。右键项目属性,配置属性–》常规中的配置类型改为动态库dll。请注意最上面的配置,是release下64位

在这里插入图片描述

在C/C++的预处理器中添加 宏

LUA_BUILD_AS_DLL

在这里插入图片描述

之后在下面的高级中把编译为改成编译为C代码:

在这里插入图片描述

至此,liblua配置上的改动完成。

选中lua项目,添加现有项,选择src/lua.c。右键属性 常规–》配置类型为 exe文件,其余改动和liblua相同。最后右键lua项目下的引用,添加引用,选择同级项目liblua

在这里插入图片描述

最后是luac项目,右键添加现有项,将src中除了lua.c文件的其余代码文件都添加到luac中,配置改动和lua项目相同,不需要额外添加引用liblua。

现在,lua项目引用中有一个liblua,其余两个项目没有引用。lua项目只有一个lua.c文件,而luac包含除了lua.c的其余src目录下的文件,liblua则应该包含除了lua.c 和 luac.c的其余所有文件。
更改编译环境为release 以及64位,生成解决方案,如果配置无误的话,生成目录下生成文件如下:

在这里插入图片描述
重点看我圈出来的4个文件是否有缺失,文件大小应该都在300k以内(截止5.4.4版本)

现在开始配置环境。

在你希望的目录下,新建文件夹Lua(名字随意),进入Lua,按如下的结构新建文件夹:

在这里插入图片描述

其中doc就是lua源码中doc文件夹的副本,将编译出来的lua.exe、luac.exe、liblua.dll拷贝到bin目录下,将bin文件夹路径添加到环境变量的path中。
命令行尝试输入lua指令,会进入lua交互编译的画面,尝试写一些简单的lua代码测试编译器是否成功。
在这里插入图片描述

lua编译环境的搭建工作至此结束,接下来是开发库和头文件的拷贝。

动态库是liblua.dll和liblua.lib两个文件,将其拷贝至Lua/lib目录下。在src中拷贝如下头文件至Lua/include中。至此,开发时会用到的头文件和库文件已经筛选完毕:

在这里插入图片描述

当然,如果你觉得麻烦且更加偏向于使用cmake构建项目,可以在lua的根目录下自建cmakelists.txt。参考如下:

# 要求cmake是3.x的版本
cmake_minimum_required(VERSION 3.0)

# 解决方案名字叫BuildLua
project(BuildLua)

# 使用的语言标准是C89/ANSI C
set(CMAKE_C_STANDARD 90)

# 是否在项目中引入头文件(阅读源码时更方便)
# 默认为否,如有需要将OFF改成ON
option(STUDY_USE "Build for learning the source codes[Add head files in projects]." OFF)

# 添加附加目录
include_directories(src)

file(GLOB LUAEXE src/lua.c)
file(GLOB LUACEXE src/luac.c)

# 设置各个子项目编译需要的源文件
if(STUDY_USE)
    file(GLOB LUALIB_SRC src/*.h src/*.c)
    list(REMOVE_ITEM LUALIB_SRC ${LUAEXE} ${LUACEXE})

    file(GLOB LUA_SRC ./src/lua.c)

    file(GLOB LUAC_SRC src/*.h src/*.c)
    list(REMOVE_ITEM LUAC_SRC ${LUAEXE})
else()
    aux_source_directory(src LUALIB_SRC)
    list(REMOVE_ITEM LUALIB_SRC ${LUAEXE} ${LUACEXE})

    file(GLOB LUA_SRC ./src/lua.c)

    aux_source_directory(src LUAC_SRC)
    list(REMOVE_ITEM LUAC_SRC ${LUAEXE})
endif()

# 定义宏LUA_BUILD_AS_DLL
add_definitions(-DLUA_BUILD_AS_DLL)

# 创建子项目——luaXX
# 生成动态库——luaXX.dll   XX为版本号,这里为54
add_library(lua54 SHARED ${LUALIB_SRC})

# 创建子项目——lua
# 生成lua解释器——lua.exe
add_executable(lua ${LUA_SRC})
target_link_libraries(lua lua54)

# 创建子项目——luac
# 生成lua编译器——luac.exe
add_executable(luac ${LUAC_SRC})

# install
# 略
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐