2012-08-08 101 views
1

我有一個需要加載到LuaInterface的Lua模塊(lpack)。我已經嘗試了幾個不同的項目配置,但我似乎無法弄清楚鏈接。構建Lua接口的Lua模塊

我得到的錯誤unresolved external symbol "void __stdcall lua_replace(struct lua_State *,int)" ([email protected]@[email protected]@[email protected]) referenced in function "int __stdcall l_unpack(struct lua_State *)" ([email protected]@[email protected]@@Z)

如果我在lua51.lib文件運行dumpbin /exports,我能找到[email protected]@[email protected]@[email protected]它匹配了什麼,我覺得在Dependency Walker中[email protected]@[email protected]@[email protected]的lua51.dll,因此函數存在,但名稱不匹配。

我對連接器管理的這個級別不是很熟悉,所以這可能是我的一個簡單的錯誤。爲什麼lpack版本中的值與lua51.lib輸入文件的值不匹配?

更新

所有在lua51.dll和lua51.lib文件出口是__cdecl和我LPACK項目已被設置爲__stdcall。更改該屬性(在C/C++ - >高級 - >調用約定)修復了編譯問題,現在我有一個lpack.dll文件。

然而,當我試圖從LUA require('lpack')文件失敗加載與The specified procedure could not be found.

打破在加載與LoadLibraryA該庫的LUA C代碼返回NULL和0x7F的的GetLastError函數()的代碼。

更新2

的lpack.dll文件我試圖將負載已經過時由於錯誤的輸出目錄,這樣固定的LoadLibrary失敗。接下來,GetProcAddress將失敗,但如果我按照Mud的建議將extern "C"添加到lpack.c文件中的導出函數中,問題就解決了。

回答

2

但是,當我嘗試從lua require('lpack')加載文件時,它失敗,找不到指定的過程。

可能因爲名字是mangled。你有沒有在DLL中查看函數的實際名稱?

你真的應該建立Lua源代碼(和用C語言編寫的任何Lua模塊)作爲C,並且在導入它們時使用extern "C"。爲您節省很多頭痛。

+0

如果錯誤出現在'GetProcAddress()'中,但是它出現在'LoadLibrary()'中,這個名字會變得有意義。不幸的是,你不能真正使用C名稱,因爲.NET使用__stdcall(請參閱http://ttuxen.wordpress.com/2009/11/03/embedding-lua-in-dotnet/) – kyork 2012-08-08 20:42:55