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.c和luac.c存在main函数,所以需要分别编译。get_filename_component(mainname ${mainfile} NAME_WE)的作用是获取不包含目录也不包含最长扩展名的文件名,即mainname为lua和luac。

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

最后可以在src\build\Debug文件夹中找到lua.exe和luac.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.exe和luac.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
相关推荐
kingx37 分钟前
Windows Server安全配置深度复盘:关键 Payload 与解题思路
windows·靶场·web·加固
技术人生00125 分钟前
DirectX修复工具下载安装教程-Windows系统游戏dll修复工具下载安装修复教程
windows·游戏
2601_962364972 小时前
企业 PC 安全升级,Windows Hello 商用生物识别模组介绍
windows·安全
CarIise4 小时前
Spring 框架:多配置文件、开发方式与 IOC 注解
junit·maven·jar
2501_916007474 小时前
Windows OpenSSL 生成 iOS 证书,制作 p12 与描述文件,KXBuild 签名实操
windows·vscode·ios·objective-c·个人开发·swift·敏捷流程
努力努力再努力wz5 小时前
【Lua入门系列】从 Table 到元表与元方法:一文理解 Lua 的行为扩展机制
开发语言·junit·lua
椒颜皮皮虾྅6 小时前
模型部署不再卡在环境上:DeploySharp 四大推理引擎与 Windows/Linux 离线交付实战
linux·运维·开发语言·人工智能·windows·计算机视觉·cuda
昂好的day7 小时前
C# 同步异步与多线程:Thread / Task / 线程池一次讲透(上篇)
开发语言·windows·c#
垆边人似月.7 小时前
Ubuntu 配置 Samba 共享文件夹并映射到 Windows 完整指南
linux·windows·ubuntu
BIBI204918 小时前
换 Git 托管平台怎么做?基于 TortoiseGit 的跨平台迁移教程
windows·git·tortoisegit·问题解决·版本控制·最佳实践