2011-02-26 125 views
6

我想編寫一個C++程序,可以在執行過程中交互/調用Lua腳本。該方案的一個關鍵概念是完全平臺獨立性,但我似乎無法找到實際提供某種東西的Lua構建。將Lua嵌入到C++中

到目前爲止,我發現的Lua構建要麼基於環境變量,要麼基於特定的庫,如.lib.dll.so。從lua.org官方Lua來源也不是我所期待的,因爲它定義了一個主要功能...

是否有一個簡單的 - 最好的情況下會像sqlite-amalgamation - 用於C/C++的Lua解釋器那沒有任何這些依賴關係?

回答

7

lua.c包含main並定義控制檯應用程序的入口點。如果你從項目中刪除它,那麼如果你願意的話,什麼都可以構建到一個獨立的庫或動態庫中,就好了。

+0

感謝您的回答!剛剛注意到,lua.c(獨立解釋器)和luac.c(Lua-to-Bytecode-Compiler)確實包含一個主 - 有點不可思議,源不是分離到不同的文件夾中... – MFH 2011-02-26 15:15:39

+0

@MFH,這個組織是相當的典型的基於經典Makefile的項目。請注意Lua的整體年齡。 Makefile從內核構建(取決於平臺)靜態和動態庫,然後根據需要編譯鏈接到它們的lua.c和luac.c。 – RBerteig 2011-02-26 21:51:34

+0

aha,說實話,雖然我用了一下MAKEFILES,但我從來沒有真正喜歡它們,我總是把應用程序分成不同的文件夾...... – MFH 2011-02-27 20:01:04

4

以下是我作爲一個起點爲我的項目使用(我發現了類似一會兒回來的東西,適應它,這樣我可以更快地改變它):


的LUA腳本文件:

-- Start 
    -- Script: myscript.lua 
    print("this is lua") 
    -- End 

的C語言文件:

#include <stdlib.h> 
    #include <stdio.h> 
    #include <lua.h> 
    #include <lauxlib.h> 
    #include <lualib.h> 

    int main(void) { 
      static const luaL_reg lualibs[] = { 
        { "base",  luaopen_base }, 
        { NULL,   NULL } 
      }; 

      static void openlualibs(lua_State *l) { 
        const luaL_reg *lib; 

        for (lib = lualibs; lib->func != NULL; lib++) { 
          lib->func(l); 
          lua_settop(l, 0); 
        } 
      } 

      lua_State *l; 
      l = lua_open(); 
      openlualibs(l); 

      printf("now calling lua\n\n"); 
      lua_dofile(l, "myscript.lua"); 
      printf("\ndo something else\n\n"); 

      lua_close(l); 
      return 0; 
    } 

您可以自由使用它作爲項目的基礎。

2

對於Lua核心和獨立解釋器的單一文件合併版本,請參見官方源工具包中的文件etc/all.c。您當然可以將其用作您自己的合併的基礎,也許可以通過在最後一行中刪除對lua.c的引用。

嵌入Lua的很多大型應用程序都是通過將核心源文件添加到項目中來完成的。如果應用程序不允許擴展代碼加載來自.dll.so文件的已編譯模塊,則此功能特別有效。如果您的應用程序允許編譯模塊,那麼通常最好鏈接到核心的共享庫,以便應用程序和加載的模塊可以引用來自核心庫的單個實例的符號。請注意,意外包含多個Lua核心實例幾乎可以確保很難診斷症狀。