web-dev-qa-db-fra.com

C ++: Symbole externe non résolu _sprintf et _sscanf dans Visual Studio 2015

Pour un projet de recherche, j'écris un complément C++ dans un langage informatique scientifique. Malheureusement, la bibliothèque qui permet aux utilisateurs de le faire n'est pas très bien mise à jour.

J'ai commencé le projet en XCode, où il s'est bien construit. Plus tard, j'ai dû migrer vers un PC. J'ai donc migré le code vers Visual Studio 2015. Depuis, je n'ai pas pu créer de code en raison des erreurs suivantes:

LNK2001 : unresolved external symbol _sprintf
LNK2019 : unresolved external symbol _sscanf referenced in function _GetDDouble
LNK2019 : unresolved external symbol _sprintf referenced in function _CheckRunningInMainThread

Une tentative de réparation consistait à ajouter l'en-tête #define _CRT_SECURE_NO_WARNINGS. Cependant, cela a) ne corrige aucune erreur et b) ajoute l'avertissement C4005 : '_CRT_SECURE_NO_WARNINGS': macro redefinition. Je suppose que la bibliothèque a déjà défini cette macro, anticipant ce problème. Quoi qu'il en soit, cela n'a pas résolu le problème.

Comment dois-je procéder?

48
NcAdams

Ajoutez la bibliothèque suivante aux fichiers d'entrée de l'éditeur de liens:

legacy_stdio_definitions.lib

VS 2015 utilise désormais des définitions en ligne qui appellent des fonctions internes pour la plupart des stdio.h les fonctions. Si un fichier objet (ou un membre de la bibliothèque) dépend de l’une de ces fonctions, le fichier legacy_stdio_definitions.lib fournit une version externe de la fonction pouvant être liée.

Votre autre option consiste à recompiler l’unité qui dépend de ces fonctions avec VS 2015 (c’est probablement l’option privilégiée).

145
Michael Burr

J'ai eu cette erreur lors de la compilation des plugins cycling max contre la version 5 max sdk (pur c api). Le correctif de la bibliothèque héritée ne fonctionnait pas pour moi (cela aurait dû être le cas, et si quelqu'un avait une idée du pourquoi, je serais curieux de le savoir), mais j'ai défini _NO_CRT_STDIO_INLINE avant le chargement de stdio, ce qui a permis de résoudre le problème.

1
David Karla