我正在尝试使用MSVC 2015 x86构建Lua和QtLua,但遇到导出/导入符号的问题。

这是我为构建Lua 5.3.2(source)所做的工作:

cl /MD /O2 /c /DLUA_BUILD_AS_DLL *.c
ren lua.obj lua.o
ren luac.obj luac.o
link /DLL /IMPLIB:lua5.3.2.lib /OUT:lua5.3.2.dll *.obj
link /OUT:lua.exe lua.o lua5.3.2.lib
lib /OUT:lua5.3.2-static.lib *.obj
link /OUT:luac.exe luac.o lua5.3.2-static.lib

到目前为止,它仍然有效,并且依赖行者显示出函数导出时没有任何困惑。

然后,我使用cmake构建QtLua,我遇到了大约100个错误,例如:
error LNK2019: unresolved external symbol _lua_close referenced in function "public: virtual __thiscall QtLua::State::~State(void)" (??1State@QtLua@@UAE@XZ)

所以基本上我的问题是DLL导出lua_close,而链接器寻找_lua_close

经过一些搜索后,_lua_close格式似乎合法,因为Microsoft文档指出,以__cdecl调用的C符号以'_'前缀修饰。

但是我不明白为什么DLL会导出未修改的名称。

在Lua中编译时的函数声明(C文件)
__declspec(dllexport) void (lua_close) (lua_State *L);

在QtLua中编译时的函数声明(C++文件)
extern "C" {
  extern void (lua_close) (lua_State *L);
}

最佳答案

快速回答

MSVC找不到lua DLL(或lib)。

长答案

不会破坏使用__cdecl调用的导出C函数,而使用__cdecl调用的内部C函数则带有'_'前缀。

资料来源:http://wyw.dcweb.cn/stdcall.htm

为了解决我的问题,我从QtLua中获取了所有源文件,并从它们中创建了一个qmake项目。和taadaa!有用! (嗯,这不是因为QtLua似乎没有在gcc之外的任何其他软件上测试过,但是我摆脱了这个链接器问题)。

我的结论是:

  • MSVC提示找不到_function,而实际上是在寻找function(或两者都在)。
  • CMake即使在配置时找到了lua库,也未能在构建时将适当的选项传递给链接器。
  • 09-10 19:46