在C語言程序中嵌入Lua腳本

標題: 在C語言程序中嵌入Lua腳本
作者: Demon
鏈接: http://demon.tw/programming/embedded-lua-in-c.html
版權: 本博客的所有文章,都遵守“署名-非商業性使用-相同方式共享 2.5 中國大陸”協議條款。

第一次知道Lua語言,是上個月在書城的時候,看到一本名爲《魔獸世界編程寶典》的書。心想,魔獸世界還能編程?難道是自己編一個魔獸世界出來?翻開一看,原來是編寫插件,用的是一種叫Lua的腳本語言。只可惜我不玩魔獸世界,當然不會對開發魔獸世界插件感興趣。最近在玩憤怒的小鳥,無意中發現這個遊戲的地圖和配置文件都是用Lua來寫的,得了多少分、過了多少關等等完全可以通過修改相應的Lua腳本文件來作弊。於是心血來潮稍稍學習了一下Lua語言。

Lua程序設計語言 是一個簡潔、輕量、可擴展的腳本語言。Lua讀作/’lua/(嚕啊),是葡萄牙語中"Luna"(月亮)的意思。Lua是一種輕量語言,它的官方版本只包括一個精簡的核心和最基本的庫。這使得Lua體積小、啓動速度快。它用標準ANSI C語言編寫並以源代碼形式開放,編譯後僅僅一百餘K,可以很方便的嵌入別的程式裏。

Lua的目標是成爲一個很容易嵌入其它語言中使用的語言。很多應用程序使用Lua作爲自己的嵌入式腳本語言,以此來實現可配置性、可擴展性。這其中包括大話西遊II、仙境傳說、魔獸世界、戰錘40k、博德之門、軒轅劍外傳漢之雲等。

要在自己的程序中使用Lua,我們必須將Lua解釋器核心編譯到自己的程序中來,無論是直接編譯到主程序中,還是作爲外部DLL調用,總之,第一件事情是編譯Lua解釋器核心。

首先,到Lua官方網站下載最新的Lua源代碼,得到的是一個.tar.gz。可以用流行的壓縮軟件如WinZip,WinRAR,或者開源的7z(推薦使用)來解開。解開的目錄中有一個src目錄,整個Lua核心代碼就在這裏了。

我們在Windows平臺上擬使用Visual C++ 6.0來進行試驗,但是src目錄中並沒有VC6使用的工程文件。這個問題很好解決:在VC6中新建一個Win32 Static Library靜態庫工程,建議工程名稱設置爲liblua,在隨後的工程設置嚮導中,不要加入任何設置,即不要勾選“Pre-Compiled Header”和“MFC Support”選項。

接下來,將所有src中的所有 .c (lua.c除外)和 .h 文件加入到工程中,編譯,就可以得到我們想要的靜態庫 liblua.lib 文件了。

在我們自己的軟件項目中,只需要 liblua.lib 和幾個頭文件就可以開發了,用到的頭文件有:

  • lauxlib.h
  • lua.h
  • luaconf.h
  • lualib.h

在編寫第一個嵌入Lua腳本的C語言程序之前,我們先編寫一個test.lua腳本以供調用,代碼如下:

print("Hello world")

現在我們來寫一個最簡單的C語言控制檯程序,並在其中內嵌Lua解釋器,運行該程序,可以執行test.lua腳本,在屏幕上打印出我們希望的結果。

在VC6中新建一個Win32 Console Application控制檯程序工程,建議工程名稱設置爲testlua。將剛纔編譯得到的liblua.lib靜態庫文件和上面列出的頭文件複製到工程的根目錄中。新建一個 .c源文件,代碼如下:

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

#pragma comment(lib, "liblua.lib")

int main(void)
{
    lua_State *L = lua_open();
    luaL_openlibs(L);
    luaL_dofile(L, "test.lua");
    lua_close(L);
    return 0;
}

看看這代碼,我都不用作解釋了。如果那麼簡單的代碼都看不懂,建議你先去看看《Programming in Lua》一書。

編譯上述代碼,得到testlua.exe,和test.lua文件放到同一個目錄下,在命令行模式執行testlua.exe,就可以看到經典的Hello world了~

就是這麼簡單!!下一次,我們將嘗試在.lua腳本中調用主程序(testlua.exe)內部的C函數~~

參考鏈接:編譯Lua庫並配置開發環境

相關文章:

  1. Windows下用TCC編譯Lua源碼
  2. C語言中size_t的陷阱
  3. 用C語言調用WMI
  4. 會Python的人,你惹不起
  5. C語言中的round函數

隨機文章:

  1. 用Shell.Application獲取圖片分辨率
  2. VC編寫在Windows 7下需要管理員權限的程序
  3. VBS中的SetLocale函數到底有什麼用?
  4. 禁用Windows系統的臨時IPv6地址
  5. 用Tiny C Compiler編譯Lua
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章