首先配置下环境,下载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/lib是Lua编译好的库文件,目前没有编译,所以自己先建个空的目录。
命 令行下,进到D:/Lua/lua-5.1.4/src目录下,执行命令。make mingw,(记得将D:/MinGW/bin目录下的mingw32-make.exe复制一份改名为make.exe),一会儿就编译好了,生成了相 应的库文件和dll文件以及exe文件,有lua.exe,luac.exe,lua51.dll以及liblua.a文件。 其中lua51.dll文 件仅仅152k,看来Lua虚拟机也够小的。
将liblua.a文件copy到D:/Lua/lib。下面写个程序来验证一下,就来个Programming in Lua中的第一个例子吧,在24.1节,代码如下:
#include <stdio.h>
#include <lua.h>
#include <lauxlib.h>
#include <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); if (error)
{
fprintf(stderr,"%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版本问题:我使用的lua为Lua 5.1.4而示例所使用的lua为5.0.根据网络上的资料将初始化代码修改为如下内容,则问题得以解决:
#include <stdio.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
int main (void)
{
char buff[256];
int error;
lua_State *L = lua_open(); /* opens Lua */
luaL_openlibs(L);
……
}
使用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
#include "lua.h"
#include "lualib.h"
#include "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,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的源码好看多了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。