2012-08-08 58 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