2012-01-28 84 views
2

我是一個絕對的初學者,當涉及到同時使用SWIG和lua,以及一個平庸的C++開發人員,我似乎並不瞭解我如何可以用Lua綁定C++類。包裝C++類使用它在Lua使用SWIG - 需要簡單的例子

我的最終目標是創建一個類的實例,並將其傳遞給我的lua腳本,該腳本以某種方式操作該對象,然後使用C++檢索該對象並執行我想要的任何操作。

所以...我已經下載了Lua和C++,編譯了幾個例子,我可以在我的C++程序中運行一些lua腳本。到現在爲止還挺好。

現在,我已經下載了SWIG。我在Windows 7上使用VC2010。根據我的理解,我想創建一個接口文件。所以,我創建了一個,example.i:

%module creature 
class Creature 
{ 
public: 
    Creature(void); 
    Creature(int id); 
    ~Creature(void); 

(...) the rest of my class here 

(只需添加%模塊的動物我Creature.h並將其保存爲creature.i)。我跑SWIG使用

swig -c++ -lua creature.i 

並得到我的creature.cxx文件。

現在,我可能會讓自己難堪,但是......我不知道下一步該怎麼做。我想以某種方式建立輸出文件?我現在怎麼使用它?我在這裏讀到http://www.swig.org/Doc1.3/Lua.html,我需要將生成的文件(* .cxx)與其餘的代碼鏈接起來(所以我只需將該文件包含在我的項目中並添加#include「Creature.h」行) 。但是,當我編譯我得到這樣的錯誤

error C2065: 'LUA_GLOBALSINDEX' : undeclared identifier 
error C2036: 'const luaL_reg *' : unknown size 

我也嘗試使用MinGW的編譯它,但我得到了同樣的問題。如果有人能夠向我展示一個示例或一步一步的教程,說明如何將這些工具一起使用,那將會很棒,因爲我很難理解整個想法。這絕對是由於我對如何使用它的基礎知識缺乏瞭解,所以請小心點一下。

任何幫助將不勝感激。

+1

在Lua發行版中搜索缺少的標識符告訴我它已在5.2版中被刪除 - 可能SWIG沒有更新以使用它。嘗試將您的Lua降級到5.1。 – millimoose 2012-01-28 00:06:49

+0

考慮到接受Lua 5.2,許多人會考慮使用它*升級,而不是降級。 – 2012-01-28 00:15:42

+0

它編譯,但現在我得到一個鏈接器錯誤:錯誤LNK2019:無法解析的外部符號_lua_error函數__wrap_new_Creature中引用。但即使在我設法編譯它之後,我怎麼才能使用它呢? – MMM 2012-01-28 00:17:53

回答

2

SWIG是一種將腳本語言鏈接到C或C++代碼的工具。它作爲預處理步驟:在.swig文件上運行SWIG可執行文件,該文件會生成一些C或C++代碼。然後,將該代碼構建到您希望鏈接到該腳本語言的任何項目中。

SWIG的Lua支持肯定不能與Lua 5.2兼容。事實上,你會發現很少有與Lua 5.2兼容的代碼。如果你想用Lua代碼實際做一些事情,至少暫時堅持5.1。

+0

因此,如果我設法編譯包含在我的對象中的C++文件,是否足夠我包含它(使用#include)在我的類中,我使用lua並調用luaopen_creature(L);?還是有不同的方式來建設這些包裝?道歉,我是新手。 – MMM 2012-01-28 00:29:05

+2

通常情況下,SWIG用於創建Lua DLL,它們使用'require' Lua函數打開。如果您嘗試使用靜態SWIG模塊,則必須使用「STATIC_LINKED」#define構建SWIG源文件。要將其初始化爲Lua狀態,您需要運行'luaopen_ *'函數,其中'*'是SWIG模塊的名稱。 SWIG的文件解釋了這一點,所以去看看。 – 2012-01-28 00:48:38

+0

就在最近一個補丁中添加了Lua 5.2支持(它非常簡單,只是一些調整)被添加到SWIG開發源中,所以在下一個版本中應該可以。 – snogglethorpe 2012-01-28 13:39:17

1

My end goal is to have an instance of a class, pass it to my lua script which manipulates that object in a certain way, then I retrieve that object in c++ and do whatever else I want to do with it.

我可能是錯的,但你沒有「通行證」的C++類到Lua的情況下,你真的做的是創建C++綁定到Lua因此你實際上在Lua中實例化一個C++類腳本本身。

即說你有一個叫做Foo的C++類,它有一個稱爲add(x,y)的方法。你可以通過做類似的事情來實例化和使用Lua中的類(假設你已經使用Swig來創建包裝文件)。

foo_instance = Foo() 
foo_instance:add(4, 3) 

我使用痛飲和Lua與我的C時,有一些不幸的事++程序,所以我寫了一個教程(所以我不會忘記我是如何做到的)。你可以在這裏查看它...http://glennmccord.wordpress.com/2012/11/05/binding-c-to-lua-using-swig/

希望它能讓你開始。