1

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

我得到错误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与我在 lua51.dll 中找到的 Dependency Walker 匹配的内容?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 和 0x7F 的 GetLastError() 代码。

更新 2

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

4

1 回答 1

2

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

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

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

于 2012-08-08T20:41:19.103 回答