Windows下使用CMake编译lua

Lua 是一个功能强大、高效、轻量级、可嵌入的脚本语言。它支持程序编程、面向对象程序设计、函数式编程、数据驱动编程和数据描述。

Lua的官方网站上只提供了源码,需要使用Make进行编译,具体的编译方法为

make 复制代码
curl -R -O http://www.lua.org/ftp/lua-5.4.6.tar.gz
tar zxf lua-5.4.6.tar.gz
cd lua-5.4.6
make all test

luaforwindows提供了Windows下的lua环境,不过已经很久没更新了。

虽然Windows下没有make,但是可以考虑通过cmake来编译lua。

编译准备

需要提前安装下面这些软件,2和3只需要选一个安装来作为编译器。

  1. cmake
  2. visual studio
  3. mingw

开始编译

下载lua的源码,解压至一个文件夹内。

进入src文件夹内,创建CMakeLists.txt,内容如下

cmake 复制代码
cmake_minimum_required(VERSION 3.0.0)
project(lua VERSION 0.1.0 LANGUAGES C)

include_directories("${PROJECT_BINARY_DIR}")
 
aux_source_directory(. C_LIST)			# 将当前路径下的所有源文件放在C_LIST变量中
list(REMOVE_ITEM C_LIST "./lua.c" "./luac.c")	# 从C_LIST中删除"./lua.c"和"./luac.c"

file(GLOB_RECURSE luamain RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/lua*.c") 	# 得到当前目录下所有以lua开头的源文件,即lua.c和luac.c
foreach(mainfile IN LISTS luamain)
    get_filename_component(mainname ${mainfile} NAME_WE)	# 得到文件名lua和luac,
    add_executable(${mainname} ${mainfile} ${C_LIST})	# mainname为可执行文件的名字,mainfile C_LIST则是生成可执行文件的源文件。
endforeach()

include(CTest)
enable_testing()

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

由于源码中一共有两个c文件lua.cluac.c存在main函数,所以需要分别编译。get_filename_component(mainname ${mainfile} NAME_WE)的作用是获取不包含目录也不包含最长扩展名的文件名,即mainnamelualuac

  1. 如果已经安装了visual studio,可以直接开始编译(确保在src文件夹中执行下面的命令)
cmd 复制代码
cmake -Bbuild  && cmake --build ./build

最后可以在src\build\Debug文件夹中找到lua.exeluac.exe两个文件。

  1. 如果只安装了mingw,需要在CMakeLists.txt中指定编译器(我的电脑中visual studio和mingw都有,不确定是不是必要的),将下面这两行加到CMakeLists.txt中(需要把路径修改为mingw安装的路径)
cmake 复制代码
set (CMAKE_C_COMPILER "D:/mingw64/bin/gcc")
set (CMAKE_CXX_COMPILER "D:/mingw64/bin/g++")

添加后的CMakeLists.txt

cmake 复制代码
cmake_minimum_required(VERSION 3.0.0)
project(lua VERSION 0.1.0 LANGUAGES C)
# 指定编译器
set (CMAKE_C_COMPILER "D:/mingw64/bin/gcc")
set (CMAKE_CXX_COMPILER "D:/mingw64/bin/g++")

include_directories("${PROJECT_BINARY_DIR}")
 
aux_source_directory(. C_LIST)
list(REMOVE_ITEM C_LIST "./lua.c" "./luac.c")

file(GLOB_RECURSE luamain RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/lua*.c")
foreach(mainfile IN LISTS luamain)
    # Get file name without directory
    get_filename_component(mainname ${mainfile} NAME_WE)
    add_executable(${mainname} ${mainfile} ${C_LIST})
endforeach()

include(CTest)
enable_testing()

set(CPACK_PROJECT_NAME ${PROJECT_NAME})
set(CPACK_PROJECT_VERSION ${PROJECT_VERSION})
include(CPack)

同时在执行时指明参数-G "MinGW Makefiles"

cmd 复制代码
cmake -Bbuild -G "MinGW Makefiles" && cmake --build ./build

最后可以在src\build文件夹中找到lua.exeluac.exe这两个文件

测试lua

命令行

cmd 复制代码
D:\compile\temp\lua-5.4.6\src\build>lua
Lua 5.4.6  Copyright (C) 1994-2023 Lua.org, PUC-Rio
> print("hello world")
hello world
> os.exit()

脚本

编写一个lua文件test.lua

lua 复制代码
-- test.lua 文件脚本
a = 5               -- 全局变量
local b = 5         -- 局部变量
function joke()
    c = 5           -- 全局变量
    local d = 6     -- 局部变量
end
joke()
print(c,d)          --> 5 nil
do
    local a = 6     -- 局部变量
    b = 6           -- 对局部变量重新赋值
    print(a,b);     --> 6 6
end
print(a,b)      --> 5 6
cmd 复制代码
D:\compile\temp\lua-5.4.6\src\build>lua test.lua
5       nil
6       6
5       6
相关推荐
cpsvps_net10 小时前
美国服务器环境下Windows容器工作负载智能弹性伸缩
windows
甄超锋10 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
cpsvps13 小时前
美国服务器环境下Windows容器工作负载基于指标的自动扩缩
windows
网硕互联的小客服16 小时前
Apache 如何支持SHTML(SSI)的配置方法
运维·服务器·网络·windows·php
etcix16 小时前
implement copy file content to clipboard on Windows
windows·stm32·单片机
许泽宇的技术分享16 小时前
Windows MCP.Net:基于.NET的Windows桌面自动化MCP服务器深度解析
windows·自动化·.net
非凡ghost17 小时前
AMS PhotoMaster:全方位提升你的照片编辑体验
windows·学习·信息可视化·软件需求
mortimer19 小时前
一次与“顽固”外部程序的艰难交锋:subprocess 调用exe踩坑实录
windows·python·ai编程
gameatp21 小时前
从 Windows 到 Linux 服务器的全自动部署教程(免密登录 + 压缩 + 上传 + 启动)
linux·服务器·windows
穷人小水滴21 小时前
在 windows 运行 flatpak 应用 (WSL)
linux·windows·ubuntu