构建Lua接口的Lua模块
我有一个需要加载到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文件中的导出函数中,问题就解决了。
但是,当我尝试从lua require('lpack')加载文件时,它失败,找不到指定的过程。
可能因为名字是mangled。你有没有在DLL中查看函数的实际名称?
你真的应该建立Lua源代码(和用C语言编写的任何Lua模块)作为C,并且在导入它们时使用extern "C"
。为您节省很多头痛。
如果错误出现在'GetProcAddress()'中,但是它出现在'LoadLibrary()'中,这个名字会变得有意义。不幸的是,你不能真正使用C名称,因为.NET使用__stdcall(请参阅http://ttuxen.wordpress.com/2009/11/03/embedding-lua-in-dotnet/) – kyork 2012-08-08 20:42:55