c++ c visual-c++ linker name-mangling

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 una function (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); }