我正在尝试使用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);
}
答案 0 :(得分:0)
MSVC没有找到lua DLL(或lib)。
使用__cdecl
调用的导出C函数不会受到损坏,而使用__cdecl
调用的内部C函数会被' _'前缀。
来源:http://wyw.dcweb.cn/stdcall.htm
为解决我的问题,我从QtLua获取了所有源文件并从中创建了一个qmake项目。还有tadaa!有用! (嗯,它没有,因为QtLua似乎没有在gcc以外的任何其他方面进行测试,但我摆脱了这个链接器问题。)
我的结论是:
_function
,实际上正在寻找function
(或两者兼而有之)。