为LuaInterface构建Lua模块

时间:2012-08-08 20:04:46

标签: c# c++ linker lua luainterface

我有一个Lua模块(lpack),我需要加载到LuaInterface中。我为项目尝试了一些不同的配置,但我似乎无法弄清楚链接。

我收到错误unresolved external symbol "void __stdcall lua_replace(struct lua_State *,int)" (?lua_replace@@YGXPAUlua_State@@H@Z) referenced in function "int __stdcall l_unpack(struct lua_State *)" (?l_unpack@@YGHPAUlua_State@@@Z)

如果我运行dumpbin /exports在lua51.lib文件,我可以找到?lua_replace@@YAXPAUlua_State@@H@Z它匹配了什么,我觉得在Dependency Walker中的lua51.dll ?lua_replace@@YAXPAUlua_State@@H@Z,这样的功能,但存在名字不匹配。

我对这种级别的链接器管理不是很熟悉,所以这对我来说可能是一个简单的错误。为什么lpack构建中的值与lua51.lib输入文件中的值不匹配?

更新

lua51.dll和lua51.lib文件中的所有导出都是__cdecl,我的lpack项目已设置为__stdcall。更改该属性(在C / C ++ - > Advanced - > Calling Convention下)修复了编译问题,我现在有了一个lpack.dll文件。

但是,当我尝试从lua require('lpack')加载文件时,它失败并显示The specified procedure could not be found.

使用LoadLibraryA加载库的lua C代码中断,返回NULL,并且GetLastError()代码为0x7F。

更新2

由于输出目录错误,我试图加载的lpack.dll文件已过期,因此修复了LoadLibrary失败。接下来,GetProcAddress会失败,但是如果我按照Mud的建议将extern "C"添加到lpack.c文件中的导出函数,问题就解决了。

1 个答案:

答案 0 :(得分:2)

  

但是,当我尝试从lua require('lpack')加载文件时,它失败并且找不到指定的过程。

可能是因为名字是mangled。您是否查看了DLL以查看函数的实际(受损)名称?

你真的应该将Lua源(以及用C编写的任何Lua模块)构建为C,并在导入时使用extern "C"。给你带来很多麻烦。