MSVC名称修饰

6

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

以下是我用于构建Lua 5.3.2 (来源)的步骤:

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格式似乎合法,因为微软文档指出使用__cdecl调用的C符号会被加上'_'前缀进行名称改编。

然而我不明白为什么DLL导出的名称没有经过改编。

Lua(C文件)编译时的函数声明

__declspec(dllexport) void (lua_close) (lua_State *L);

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

0

快速答案

MSVC未找到lua DLL(或lib)。

详细回答

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

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

为了解决我的问题,我从QtLua中取出所有源文件,并从中创建了一个qmake项目。然后,它就可以工作了!(好吧,它并没有因为QtLua似乎只在gcc上进行了测试,但我摆脱了这个链接器问题)。

我的结论是:

  • MSVC抱怨找不到_function,实际上正在寻找function(或者可能两者都有)。
  • CMake即使在配置时找到了lua库,也未能在构建时将正确的选项传递给链接器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接