c++ - MSVC nombre mangling
visual-c++ linker (1)
Respuesta rápida
MSVC no encontró la lua DLL (o lib).
Respuesta larga
Las funciones C exportadas llamadas usando __cdecl
no se __cdecl
, mientras que las funciones C internas llamadas usando __cdecl
se destrozan con un prefijo ''_''.
Fuente: http://wyw.dcweb.cn/stdcall.htm
Para solucionar mi problema, tomé todos los archivos fuente de QtLua y creé un proyecto qmake a partir de ellos. ¡Y tadaa! ¡Funciona! (Bueno, no es así porque QtLua no parece ser probado en otra cosa que no sea gcc, pero me deshice de este problema del enlazador).
Mi conclusión es que:
- MSVC se queja de no encontrar
_function
y de hecho está buscando unafunction
(o tal vez ambas). - CMake, incluso si encontró la biblioteca lua en el momento de la configuración, no pasó las opciones adecuadas al vinculador en tiempo de compilación.
Estoy intentando construir Lua y QtLua con MSVC 2015 x86 y he encontrado un problema con los símbolos exportados / importados.
Esto es lo que hago para construir Lua 5.3.2 ( fuente ):
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
Hasta el momento funciona y dependancy walker muestra que las funciones se exportan sin ningún tipo de manipulación.
Luego construyo QtLua usando cmake y obtuve alrededor de 100 errores como:
error LNK2019: unresolved external symbol _lua_close referenced in function "public: virtual __thiscall QtLua::State::~State(void)" (??1State@QtLua@@UAE@XZ)
Así que, básicamente, mi problema es que el archivo DLL exporta lua_close
y el enlazador busca _lua_close
.
Después de buscar un poco, el formato _lua_close
parece legítimo, ya que la documentación de Microsoft indica que los símbolos C llamados con __cdecl
están mutilados con un prefijo ''_''.
Sin embargo, no entiendo por qué el archivo DLL exporta nombres no marcados.
Declaración de función cuando se compila en Lua (archivos C)
__declspec(dllexport) void (lua_close) (lua_State *L);
Declaración de función cuando se compila en QtLua (archivos C ++)
extern "C" {
extern void (lua_close) (lua_State *L);
}