使用mingw編譯Lua

很久沒學習C/C++了,一直在研究Python,都研究2年了,不過這段時間發現了Lua作的確實很小巧,虛擬機很小,也很值得作嵌入開發,比Python虛擬機小巧多了,正好研究下,等Python3.0出來後,我仍是會再從新投入Python3.0的嵌入開發吧。c++

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

這裏我將最新版的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編譯好的庫文件,目前沒有編譯,因此本身先建個空的目錄。spa

 

命令行下,進到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節,代碼以下:debug

#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
}
orm

 

命令行下編譯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的源碼好看多了。

相關文章
相關標籤/搜索