VS2012编译Lua5.1的luafilesystem(lfs)

⌚Time: 2024-04-10 01:59:15

👨‍💻Author: Jack Ge

LuaFileSystem是一个Lua库,用于补充标准Lua发行版提供的与文件系统相关的一组函数。

LuaFileSystem提供了一种可移植的方式来访问底层目录结构和文件属性。LuaFileSystem是免费软件,使用与Lua 5相同的许可证。

下面的办法不使用luarock包管理器安装lfs,而是直接编译lfs成dll文件导入lua使用

lfs源码下载

lfs发布地址:

https://github.com/lunarmodules/luafilesystem

下载后解压,我下载1.6.2版本。在src目录就是他的源码,有三个文件:

头文件lfs.h

源文件lfs.c

模块定义文件lfs.def(用于导出符号)

下载lua库

编译lfs需要使用lua的库

lua5.1的windows版静态库下载地址

https://sourceforge.net/projects/luabinaries/files/5.1.5/Windows%20Libraries/Static/

下载后解压得到文件


│  lua5.1.lib

│

└─include

        lauxlib.h

        lua.h

        lua.hpp

        luaconf.h

        lualib.h

编译lfs.dll

打开vs2012,新建一个空项目起名lfs。

右键项目,添加,现有项。把lfs.hlfs.clfs.def都添加到项目里。

项目,属性,把项目改为release模式win32,然后在配置属性,常规,配置类型选择动态库(.dll),因为是要生成动态库文件而不是可执行文件

在c/c++,常规,附加包含目录里面,加入lua库的include路径

在链接器,常规,附加库目录里面,填入lua库的目录

在链接器,输入,附加依赖项,填入链接的库,这里是lua5.1.lib静态库文件。

同时在模块定义文件输入lfs.def的完整路径,指定模块定义文件。如果不是完整路径,即使def文件加入了项目,因为不在项目目录下,还是会找不到。

之后保存,选择release模式,win32,编译就会生成lfs.dll,如果提示def文件的version语法错误,那么就打开def文件,改一下version后面的版本,比如1.5.0改成了1.5


LIBRARY lfs.dll

DESCRIPTION "LuaFileSystem"

VERSION 1.5

EXPORTS

luaopen_lfs



检测和使用

可以查看dll是否正确导出符号,打开vs2012开发人员命令行工具,切换到lsf.dll目录,输入dumpbin /exports命令,可以看到导出了_luaopen_lfs符号,这是lua调用c语言模块的入口点


dumpbin /exports lfs.dll

Microsoft (R) COFF/PE Dumper Version 11.00.50727.1

Copyright (C) Microsoft Corporation.  All rights reserved.





Dump of file lfs.dll



File Type: DLL



  Section contains the following exports for lfs.dll



    00000000 characteristics

    6615783B time date stamp Wed Apr 10 01:17:47 2024

        0.00 version

           1 ordinal base

           1 number of functions

           1 number of names



    ordinal hint RVA      name



          1    0 00001F40 luaopen_lfs = _luaopen_lfs



  Summary



        1000 .data

        2000 .rdata

        2000 .reloc

        1000 .rsrc

        A000 .text

之后把生成的lfs.dll文件放到lua的主目录下就可以使用了,引用lfs模块语法


local lfs = require("lfs")

当库文件移植到其他电脑上,如果出现无法导入库的错误,可能需要安装VS2012运行库,因为是用VS2012进行编译的。