4 votes

Noms manquants dans le fichier dll de lua5.3

Sous Visual Studio (2017), j'essaie de script un programme C++ avec Lua 5.3 mais le linker ne trouve pas trois noms de fonctions référencées dans mon fichier source C++ :

symbole externe non résolu _lua_close

symbole externe non résolu _lua_createtable

symbole externe non résolu _luaL_newstate

J'ai pris la source C++ de la Site web Lua .

J'ai téléchargé la bibliothèque dynamique Lua 5.3 qui n'est pas fournie avec une bibliothèque d'importation. J'ai donc créé la bibliothèque d'importation avec les outils MSVC comme suit :

dumpbin /exports E:\Documents\Programmation\Lua5.3\lua53.dll

A partir de la sortie de dumpbin, j'ai copié les 146 noms dans un nouveau fichier "mylua53lib.def" et j'ai lancé lib pour générer le fichier .lib comme ceci :

lib /def:E:\Documents\Programmation\Lua5.3\mylua53lib.def /OUT:E:\Documents\Programmation\Lua5.3\mylua53lib.lib /machine:x86

Les trois noms de fonctions que le linker ne trouve pas n'apparaissent en effet pas dans la sortie de la commande dumpbin.

1voto

Bartek Banachewicz Points 13173

Une distribution binaire de Lua destinée à la liaison dynamique sous Windows doit contenir deux fichiers binaires :

  • un fichier DLL contenant le code Lua réel
  • un fichier de bibliothèque avec les stubs de méthode déléguant à la DLL

Parfois, le fichier de la bibliothèque est accompagné d'un .a qui est plus courante sous Linux (par opposition à l'extension .lib sur Windows). S'il s'agit d'une version Windows, vous pouvez simplement passer ce fichier comme dépendance de l'éditeur de liens et cela fonctionnera parfaitement. Cette question traite des différences entre les deux conventions.

À titre d'information, pour que cela fonctionne, si vous créez un projet C++ dans Visual Studio, et que vous ajoutez une balise Source.cpp comme il le suggère par défaut, vous obtiendrez toujours des externes non résolus. Ceci est dû au fait que, bien que les sources C se compilent très bien en tant que code C++, l'éditeur de liens s'attendra à des noms tronqués pour les définitions des fonctions C utilisées. Ceci peut être évité soit en compilant le fichier en tant que code C, soit, de préférence, en lui indiquant que les noms des en-têtes Lua doivent être démêlés dans la bibliothèque liée en utilisant la commande suivante extern "C" :

extern "C" {

#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#include <stdlib.h>
#include <stdio.h>

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X