文档章节

使用mingw编译Lua

徐学良
 徐学良
发布于 2016/01/04 09:30
字数 911
阅读 180
收藏 3

好久没学习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> 
#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, 000);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版本原因:我使用的luaLua 5.1.4而示例所使用的lua5.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},
  {NULLNULL}
};


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, 10);
  }
}

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


本文转载自:http://blog.csdn.net/bz201/article/details/3413684

徐学良
粉丝 24
博文 213
码字总数 13841
作品 0
浦东
程序员
私信 提问
mingw 或 msys2 用 gcc 编译 lua

在 Windows 操作系统上喜欢使用 msys2 (mingw32 已经很久不更新了),具体我用的 msys2 中的 mingw64 ,下面的测试都是在 mingw64 上测试的。使用的 lua 是 5.2.4 版本。 其实发现在 mingw ...

ylme
2017/02/12
241
0
关于在windows下安装golua具体实践

这几天考虑在golang中嵌入lua脚本,在网上找了很多golang封装的lua,最后找到了https://github.com/aarzilli/golua,它是https://github.com/afitz/golua的一个分支,这个aarzilli/golua目前一...

wkh
2013/09/25
1K
4
MinGW在Win7下的按装、设置和使用 (Lu Hongling)

1.引言 MinGW is the abbreviation of “Minimalist GCC Windows”. 简单地说, MinGW就是windows下的GCC [2]. 在windows下按装了MinGW, 就按装了C/C++, Fortran, 等语言编译器套间. MinGW是完...

luhongling
2012/08/19
4K
0
手把手教你在Windows下使用MinGW编译libav

手把手教你在Windows下使用MinGW编译libav libav是在Linux下使用纯c语言开发的,不可避免的,libav源码使用了一些gcc的特性,那么在Windows下很难使用VC编译,但是使用MinGW编译却简单多了,...

shzwork
05/21
17
0
windows下在vim中使用gcc/g++编译调试c/cpp文件

用了半年时间Vim了,vim的好不用我说了,用过就知道。 使用vim写php的话,在浏览器运行即可。但是想要编译c/cpp文件的话,windows下一般都是使用ide,可是习惯了在Linux使用gcc和gdb之后,怎...

Jay-zone
2010/11/14
8.4K
5

没有更多内容

加载失败,请刷新页面

加载更多

js如何控制table中的某一行动态置顶

两行代码搞定: $('#'+item.roadCode).fadeOut().fadeIn();//获取到需要置顶的行 $(".table").prepend($('#'+item.roadCode)); 其中,fadeOut()方法 作用 --- 从可见到隐藏 如下: prepend(......

码妞
今天
4
0
四种解决Nginx出现403 forbidden 报错的方法

我是在在本地用虚拟机中通过yum安装nginx的,安装一切正常,但是访问时报403, 于是查看nginx日志,路径为/var/log/nginx/error.log。打开日志发现报错Permission denied,详细报错如下: 1....

dragon_tech
今天
3
0
获取RestResultResponse返回的值

Springboot项目,需要调其他服务的接口,返回值类型是RestResultResponse 打断点的结果集是这个 打印出来的getData(): [{id=3336b624-8474-4dd9-bd5b-c7358687c877, paraNo=104, para=Postpo...

栾小糖
今天
4
0
【小学】 生成10以内的加减法

#!/usr/bin/env python# coding: utf-8from random import randrange# 题目的最大数值R_MAX = 10# 生成的题目的数量R_PAGE = 70# 生成减法列表def get_sub_list():...

Tensor丨思悟
今天
11
0
JavaScript设计模式——适配器模式

  适配器模式是设计模式行为型模式中的一种模式;   定义:   适配器用来解决两个已有接口之间不匹配的问题,它并不需要考虑接口是如何实现,也不用考虑将来该如何修改;适配器不需要修...

有梦想的咸鱼前端
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部