簡體   English   中英

在 C++ 中使用 Lua

[英]Using Lua in C++

我正在嘗試在 C++ 中使用 Lua,但我無法編譯我的代碼。 我正在使用最新版本的 Lua,目前是 5.3。 我的 IDE 是 Code::Blocks。 到目前為止,我正在遵循以下指南: https : //eliasdaler.wordpress.com/2013/10/11/lua_cpp_binder/ http://gamedevgeek.com/tutorials/getting-started-with-lua/

然而,他們並沒有解釋如何在 C::B 中設置 Lua。 我已經從 Lua 的網站下載了二進制 zip 和源代碼。 我不確定將 src 文件夾中的文件放在哪里。 到目前為止,我已經將 lauxlib.h、lua.h、luaconf.h 和 lualib.h 放入 include 目錄,並在 main.cpp 中使用了以下代碼:

extern "C" {
    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
}

到目前為止,我只是嘗試運行以下小片段:

lua_State* L;
L = luaL_newstate();
luaL_openlibs(L);
luaL_dofile(L, "test.lua");
lua_close(L);

但是我總是在第一行出錯。 我目前得到的錯誤指出引用未定義為“luaL_newstate”。

也許我應該從源代碼中將一些文件放在 lib 目錄中? 或者我必須在“項目構建選項”菜單中的“其他鏈接器選項”中添加什么?

編輯:

同時我發現了這個問題: Lua 5.3 undefined references

似乎我必須將 -llua 放到“Opther 鏈接器選項”中,但是 lua.org 的軟件包中沒有包含 .a、.so 或 .lib 文件。

我終於可以讓問題中提到的代碼運行了。 這就是我所做的。

  1. 我沒有從 Lua 的站點下載源代碼,而是下載了最新的LuaDist 該站點也可以通過 Lua.org 的二進制類別下的下載頁面訪問。

  2. 在那個 zip 中,有通常的 include 和 lib 文件夾。

  3. 我已將兩者都復制到相應的文件夾中,並在“構建選項”菜單下設置編譯器和鏈接器的路徑。

  4. 然后,在鏈接器設置選項卡下,我添加了 liblua.dll.a 文件,該文件可以在 lib 目錄中找到。 對於最后兩個步驟,您可以在SFML 設置頁面找到其他幫助。

  5. 對於最后一步,我將 liblua.dll 文件放在編譯后的可執行文件旁邊。

LUA + C++中的 hello world 示例

主程序

#include <iostream>

#ifdef __cplusplus
  extern "C" {
    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
  }
#endif //__cplusplus

int main(int argc, char **argv) {
    std::cout << "LUA is saying: ";

    lua_State* L;
    L = luaL_newstate();
    lua_pushstring(L, "Anna");
    lua_setglobal(L, "name");
    luaL_openlibs(L);
    if(luaL_dofile(L, "hello.lua")) {
        std::cout << "Final:" << lua_tostring(L, -1) << "\n";
    }
    lua_close(L);
}

你好.lua

print("Hello World!")
print("Hello", name)

生成文件

hello: main.cpp
    g++ -I/usr/include/lua5.3/ main.cpp -llua5.3 -o hello

這個例子是創建一個新的lua_State ,它是lua引擎用來執行代碼的主要上下文。 下一步,我們需要打開庫,如果需要,添加將被lua使用的其他庫。

在我們開始執行之前,我們可以通過將值壓入堆棧並調用lua_setglobal()來設置全局變量來設置 lua 代碼將訪問的全局上下文中的變量。

最后,我們使用輔助函數luaL_dofile() ,它將執行文件並在沒有錯誤的情況下返回false (0),或者在有錯誤的情況下返回true (1)。 如果出現錯誤,狀態中堆棧的最后一個值將是錯誤描述。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM