web-dev-qa-db-fra.com

Symboles externes aléatoires non résolus qui ne devraient pas être là

Je suis habitué à compiler pour Linux, donc ces fichiers .lib sont un peu bizarres pour moi. Avec mon programme sous Visual Studio, je continue à avoir des symboles externes aléatoires non résolus pour d'autres bibliothèques et même Microsoft Runtimes.

1>glfw3.lib(init.c.obj) : error LNK2019: unresolved external symbol __imp__vsnprintf referenced in function __glfwInputError
1>MSVCRTD.lib(vsnprintf.obj) : error LNK2001: unresolved external symbol __imp__vsnprintf
1>glfw3.lib(context.c.obj) : error LNK2019: unresolved external symbol __imp__sscanf referenced in function _parseVersionString
1>MSVCRTD.lib(vsnprintf.obj) : error LNK2001: unresolved external symbol __imp___vsnprintf
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\OLDNAMES.lib : warning LNK4272: library machine type 'UNKNOWN' conflicts with target machine type 'X86'

Je n'inclus que ces bibliothèques et je peux confirmer qu'elles ont été trouvées:

x86/glew32s.lib
x86/glfw3.lib
x86/glfw3dll.lib
opengl32.lib

Avec leurs valeurs héritées:

kernel32.lib
user32.lib
gdi32.lib
winspool.lib
comdlg32.lib

Je peux confirmer que c'est l'ordre exact. J'ai essayé d'installer et de réinstaller Windows 7 SDK et Visual Studio. Je suis également sous Windows 7.

Toute aide concernant ce problème serait appréciée et je me ferai un plaisir de donner plus d’informations au besoin.

Merci, Boncey

10
Boncey

Le problème est que vos bibliothèques statiques glfw ont été créées avec une version de Visual Studio différente de celle que vous utilisez. À compter du printemps 2015, les versions prédéfinies de glfw.org ne sont plus compatibles avec Visual Studio 2015 RC (que vous semblez utiliser).

Heureusement, GLFW est une petite base de code publiée sous licence permissive. La solution la plus simple consiste donc simplement à créer un nouveau projet dans votre solution. Les étapes vont quelque chose comme ça:

  1. Créez un nouveau projet vide GLFW dans votre solution.
  2. Copiez dans la include, deps/GL et créez un dossier src.
  3. Copiez tous les fichiers source dans le dossier src pour les plates-formes que vous souhaitez prendre en charge. Pour Windows, c'est tout avec un préfixe win ou wgl ou aucun préfixe. Vous pouvez ignorer tous les trucs de cmake.
  4. Créez un fichier dans src appelé glfw_config.h contenant #defines de _GLFW_WIN32, _GLFW_WGL et _GLFW_USE_OPENGL. Si vous souhaitez prendre en charge plus que Windows, vous devez définir de manière conditionnelle les options souhaitées dans ce fichier. Toutes les options sont décrites dans src/glfw_config.h.in.
  5. Ajoutez tous les fichiers pertinents au projet Visual Studio.
  6. Dans les options du projet, définissez Type de configuration sur static lib. Sous C/C++> Général, assurez-vous que les vérifications SDL sont désactivées. Et sous Préprocesseur, ajoutez _GLFW_USE_CONFIG_H aux définitions.
  7. Définissez votre projet principal comme dépendant du projet GLFW (dans le menu contextuel). Enfin, ajoutez la bibliothèque GLFW correcte à vos dépendances de l’éditeur de liens. (J'ai le répertoire de sortie pour GLFW configuré de sorte que la bonne lib est juste $(SolutionDir)GLFW\$(Platform)\$(Configuration)\glfw.lib.)
8
Dan

Vous pouvez également ajouter une bibliothèque supplémentaire à votre entrée de l'éditeur de liens i.e, legacy_stdio_definitions.lib

Allez dans Propriétés> Éditeur de liens> Entrée.

Et dans Additional Dependencies, ajoutez la bibliothèque mentionnée ci-dessus.

18
Gurjot Bhatti

Il semble y avoir une erreur de connexion entre les liens de bibliothèque d'exécution dynamiques et statiques. Le préfixe "__imp" sur les symboles signifie que votre code recherche quelque chose dans une DLL, mais que les bibliothèques avec lesquelles vous êtes en liaison attendent probablement des bibliothèques d'exécution statiques.

Affichez les pages de propriétés du projet (sous Build-> Properties), puis recherchez la catégorie C++ à gauche. Sous "Génération de code", il devrait y avoir une entrée appelée "Bibliothèque d'exécution". Ceci est probablement actuellement défini sur Debug multi-thread DLL (/ MDd), car il semble que vous compiliez en mode débogage. Changez-le en débogage multithread (/ MTd) et recompilez tout. Voyez si cela fonctionne maintenant.

0
Mark Morrison