我有一个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文件中的导出函数,问题就解决了。
答案 0 :(得分:2)
但是,当我尝试从lua require('lpack')加载文件时,它失败并且找不到指定的过程。
可能是因为名字是mangled。您是否查看了DLL以查看函数的实际(受损)名称?
你真的应该将Lua源(以及用C编写的任何Lua模块)构建为C,并在导入时使用extern "C"
。给你带来很多麻烦。