构建Lua界面的Lua模块

我有一个 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 中 lua51.dll 的 ?lua_replace@@YAXPAUlua_State@@H@Z 匹配的 ?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') 失败,出现“找不到指定的程序”错误。

在用 LoadLibraryA 加载库的 lua C 代码中断点可以返回 NULL,GetLastError() 返回 0x7F。

更新 2

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

点赞
用户501459
用户501459

然而,当我尝试从lua require('lpack')加载文件时,会出现“指定的过程未找到”的错误。

可能是因为名称被mangled了。你是否查看了DLL中函数的实际(mangled)名称?

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

2012-08-08 20:41:19