Ben*_*n T 6 c c++ linker name-mangling visual-c++
我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)
到目前为止,它的工作原理和依赖性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)
Run Code Online (Sandbox Code Playgroud)
所以基本上我的问题是DLL导出lua_close和链接器寻找_lua_close.
经过一些搜索后,_lua_close格式似乎是合法的,因为Microsoft文档声明调用的C符号__cdecl带有'_'前缀.
但是,我不明白为什么DLL导出未编码的名称.
在Lua(C文件)中编译时的函数声明
__declspec(dllexport) void (lua_close) (lua_State *L);
Run Code Online (Sandbox Code Playgroud)
在QtLua(C++文件)中编译时的函数声明
extern "C" {
extern void (lua_close) (lua_State *L);
}
Run Code Online (Sandbox Code Playgroud)
MSVC 未找到 lua DLL(或 lib)。
调用 using 的导出 C 函数__cdecl不会被破坏,而调用 using 的内部 C 函数__cdecl会被带有“_”前缀的破坏。
来源: http: //wyw.dcweb.cn/stdcall.htm
为了解决我的问题,我从 QtLua 获取了所有源文件并从中创建了一个 qmake 项目。还有塔达!有用!(好吧,这并不是因为 QtLua 似乎没有在 gcc 之外的其他任何东西上进行测试,但我摆脱了这个链接器问题)。
我的结论是:
_function,实际上正在寻找function(或者可能两者都在寻找)。