我想編寫一個C++程序,可以在執行過程中交互/調用Lua腳本。該方案的一個關鍵概念是完全平臺獨立性,但我似乎無法找到實際提供某種東西的Lua構建。將Lua嵌入到C++中
到目前爲止,我發現的Lua構建要麼基於環境變量,要麼基於特定的庫,如.lib
,.dll
或.so
。從lua.org官方Lua來源也不是我所期待的,因爲它定義了一個主要功能...
是否有一個簡單的 - 最好的情況下會像sqlite-amalgamation - 用於C/C++的Lua解釋器那沒有任何這些依賴關係?
我想編寫一個C++程序,可以在執行過程中交互/調用Lua腳本。該方案的一個關鍵概念是完全平臺獨立性,但我似乎無法找到實際提供某種東西的Lua構建。將Lua嵌入到C++中
到目前爲止,我發現的Lua構建要麼基於環境變量,要麼基於特定的庫,如.lib
,.dll
或.so
。從lua.org官方Lua來源也不是我所期待的,因爲它定義了一個主要功能...
是否有一個簡單的 - 最好的情況下會像sqlite-amalgamation - 用於C/C++的Lua解釋器那沒有任何這些依賴關係?
lua.c包含main並定義控制檯應用程序的入口點。如果你從項目中刪除它,那麼如果你願意的話,什麼都可以構建到一個獨立的庫或動態庫中,就好了。
以下是我作爲一個起點爲我的項目使用(我發現了類似一會兒回來的東西,適應它,這樣我可以更快地改變它):
的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;
}
您可以自由使用它作爲項目的基礎。
對於Lua核心和獨立解釋器的單一文件合併版本,請參見官方源工具包中的文件etc/all.c
。您當然可以將其用作您自己的合併的基礎,也許可以通過在最後一行中刪除對lua.c
的引用。
嵌入Lua的很多大型應用程序都是通過將核心源文件添加到項目中來完成的。如果應用程序不允許擴展代碼加載來自.dll
或.so
文件的已編譯模塊,則此功能特別有效。如果您的應用程序允許編譯模塊,那麼通常最好鏈接到核心的共享庫,以便應用程序和加載的模塊可以引用來自核心庫的單個實例的符號。請注意,意外包含多個Lua核心實例幾乎可以確保很難診斷症狀。
感謝您的回答!剛剛注意到,lua.c(獨立解釋器)和luac.c(Lua-to-Bytecode-Compiler)確實包含一個主 - 有點不可思議,源不是分離到不同的文件夾中... – MFH 2011-02-26 15:15:39
@MFH,這個組織是相當的典型的基於經典Makefile的項目。請注意Lua的整體年齡。 Makefile從內核構建(取決於平臺)靜態和動態庫,然後根據需要編譯鏈接到它們的lua.c和luac.c。 – RBerteig 2011-02-26 21:51:34
aha,說實話,雖然我用了一下MAKEFILES,但我從來沒有真正喜歡它們,我總是把應用程序分成不同的文件夾...... – MFH 2011-02-27 20:01:04