MSVC名称错误

时间:2016-05-30 13:37:40

标签: c++ c visual-c++ linker name-mangling

我正在尝试使用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

到目前为止它的工作原理和依赖性walker显示函数在没有任何重整的情况下导出。

然后我使用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);
}

1 个答案:

答案 0 :(得分:0)

快速回答

MSVC没有找到lua DLL(或lib)。

答案很长

使用__cdecl调用的导出C函数不会受到损坏,而使用__cdecl调用的内部C函数会被' _'前缀。

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

为解决我的问题,我从QtLua获取了所有源文件并从中创建了一个qmake项目。还有tadaa!有用! (嗯,它没有,因为QtLua似乎没有在gcc以外的任何其他方面进行测试,但我摆脱了这个链接器问题。)

我的结论是:

  • MSVC抱怨找不到_function,实际上正在寻找function(或两者兼而有之)。
  • CMake,即使它在配置时发现了lua库,也无法在构建时将适当的选项传递给链接器。