我有一个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)
如果在lua51.lib文件上运行dumpbin /exports,则可以使用Dependency Walker ?lua_replace@@YAXPAUlua_State@@H@Z找到与lua51.dll中找到的匹配的?lua_replace@@YAXPAUlua_State@@H@Z,因此该函数存在,但名称不匹配。

我对链接器管理的这种级别不是很熟悉,所以这对我来说可能是一个简单的错误。为什么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,并且GetLastError()代码为0x7F。

更新2

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

最佳答案



可能是因为名称是mangled。您是否在DLL中查看了该函数的实际名称(错位)?

您确实应该将Lua源代码(以及任何用C编写的Lua模块)构建为C,并在导入它们时使用extern "C"。为您省去许多麻烦。

07-26 08:54