c# - 为 LuaInterface 构建 Lua 模块

标签 c# c++ linker lua luainterface

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

我收到错误未解析的外部符号“void __stdcall lua_replace(struct lua_State *,int)”(?lua_replace@@YGXPAUlua_State@@H@Z)在函数“int __stdcall l_unpack(struct lua_State *)”中引用(?l_unpack@@YGHPAUlua_State@@@Z)

如果我在 lua51.lib 文件上运行 dumpbin/exports,我可以找到 ?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') 加载文件时,它会失败,并显示 无法找到指定的过程。

中断使用 LoadLibraryA 加载库的 lua C 代码会返回 NULL 和 GetLastError() 代码 0x7F。

更新2

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

最佳答案

However, when I attempt to load the file from lua require('lpack') it fails with The specified procedure could not be found.

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

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

关于c# - 为 LuaInterface 构建 Lua 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11872309/

相关文章:

c# - 如何在一段时间内更改变量

c++ - 抛出异常错误 'terminate called...'

c++ - 如何指定库路径的偏好?

c - 在 Visual Studio 2017 中的 errno 上收到链接错误 lnk2001

c# - 接口(interface)是否属于它们自己的文件

c# - 如何从不良词中过滤出richtextbox?

c# - 如何在 MessageBox 上显示 FARPROC 内存地址

c++ - C++ 中的 GStreamer 管道

linker - go + cgo 和链接

c# - C# 中是否有任何速记来使 setter 额外设置一个脏标志