加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

使用MinGW编译Lua

发布时间:2020-12-14 22:26:36 所属栏目:大数据 来源:网络整理
导读:好久没学习 C/C++ 了,一直在研究 Python ,都研究 2 年了,不过这段时间发现了 Lua 做的确实很小巧,虚拟机很小,也很值得做嵌入开发,比 Python 虚拟机小巧多了,正好研究下,等 Python3.0 出来后,我还是会再重新投入 Python3.0 的嵌入开发吧。 用 VS 编

好久没学习C/C++了,一直在研究Python,都研究2年了,不过这段时间发现了Lua做的确实很小巧,虚拟机很小,也很值得做嵌入开发,比Python虚拟机小巧多了,正好研究下,等Python3.0出来后,我还是会再重新投入Python3.0的嵌入开发吧。

VS编译Lua就太Easy了,以后决定使用MingW来做为我首要的C/C++编译器。首先配置下环境,下载MinGW-5.1.4.exe自动安装程序,安装好gcc的环境。

其次下载MSYS,这部是必须的,里面包含了很多UNIX下的工具,编译一般的库都需要它,比如STLport-5.2.0的版本。

最关键的一步是设置环境变量。设置如下,根据你安装的环境设置,写成的bat文件如下所示:

set?PATH=D:/MinGW/bin;D:/msys/1.0/bin;%PATH%????
set?LIBRARY_PATH=D:/MinGW/lib;D:/Lua/lib;%LIBRARY_PATH%??
set?C_INCLUDE_PATH=D:/MinGW/include;D:/Lua/lua-5.1.4/src;%C_INCLUDE_PATH%??
set?CPLUS_INCLUDE_PATH=D:/MinGW/include/c++/3.4.5;D:/MinGW/include/c++/3.4.5/mingw32;D:/MinGW/include/c++/3.4.5/backward;D:/MinGW/include;%CPLUS_INCLUDE_PATH%

这里我将最新版的Lua 5.1.4的版本,解压到D:/Lua/lua-5.1.4下,上面设置C_INCLUDE_PATH路径包含了D:/Lua/lua-5.1.4/src,这表示使用Lua所需要的头文件。要不然在代码中include <lua.h> 会提示找不到头文件的。上面的D:/Lua/libLua编译好的库文件,目前没有编译,所以自己先建个空的目录。

?

命令行下,进到D:/Lua/lua-5.1.4/src目录下,执行命令。make mingw,(记得将D:/MinGW/bin目录下的mingw32-make.exe复制一份改名为make.exe),一会儿就编译好了,生成了相应的库文件和dll文件以及exe文件,有lua.exeluac.exelua51.dll以及liblua.a文件。 其中lua51.dll文件仅仅152k,看来Lua虚拟机也够小的。

liblua.a文件copyD:/Lua/lib。下面写个程序来验证一下,就来个Programming in Lua中的第一个例子吧,在24.1节,代码如下:

#include <stdio.h>?
#include <lua.h>?
<lauxlib.h>?
<lualib.h>?
int?main (void)
{
????char?buff[256];
????int?error;
????lua_State *L = lua_open(); /*?opens Lua */
????luaopen_base(L); /*?opens the basic library */?
????luaopen_table(L); /*?opens the table library */?
????luaopen_io(L); /*?opens the I/O library */?
????luaopen_string(L); /*?opens the string lib. */?
????luaopen_math(L); /*?opens the math lib. */?
????while?(fgets(buff,sizeof(buff),stdin) != NULL)
????{
????????error = luaL_loadbuffer(L,buff,strlen(buff),"line") || lua_pcall(L,0,0); if?(error)
????????{
????????????fprintf(stderr,160); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">"
%s",lua_tostring(L,-1)); lua_pop(L,1);/*?pop error message from the stack */?
????????}
????}
????lua_close(L);
????return?0;
}

?

命令行下编译gcc -o test.exe test.c –llua 这样生成了一个exe文件,运行下,居然出现了PANIC: unprotected error in call to Lua API (no calling environment)Google了一下,哦,原来新版的已经修改打开库的方式,查阅网上资料后,发现是lua版本问题:我使用的luaLua 5.1.4而示例所使用的lua5.0.根据网络上的资料将初始化代码修改为如下内容,则问题得以解决:

lua_State *L = lua_open()代替前面的luaopen_base(L); luaopen_table(L);luaopen_io(L);luaopen_string(L);luaopen_math(L);
问题即可解决。其实我们可以打开Lua源代码中的linit.c文件,可以看到下面的部分:

/*
** $Id: linit.c,v 1.14.1.1 2007/12/27 13:02:25 roberto Exp $
** Initialization of libraries for lua.c
** See Copyright Notice in lua.h
*/


#define linit_c
#define LUA_LIB

"lua.h"

"lualib.h"
"lauxlib.h"


static?const?luaL_Reg lualibs[] = {
??{"",luaopen_base},
??{LUA_LOADLIBNAME,luaopen_package},
??{LUA_TABLIBNAME,luaopen_table},
??{LUA_IOLIBNAME,luaopen_io},
??{LUA_OSLIBNAME,luaopen_os},
??{LUA_STRLIBNAME,luaopen_string},
??{LUA_MATHLIBNAME,luaopen_math},
??{LUA_DBLIBNAME,luaopen_debug},
??{NULL,76); -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">NULL
}
};


LUALIB_API void?luaL_openlibs (lua_State *L) {
??const?luaL_Reg *lib = lualibs;
??for?(; lib->func; lib++) {
????lua_pushcfunction(L,lib->func);
????lua_pushstring(L,lib->name);
????lua_call(L,1,0);
??}
}

现在知道为什么要使用 luaL_openlibs 了吧 , 看来云风大侠说的没错, Lua 代码写的很漂亮,比 Python 的源码好看多了。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读