Visual C ++: comment désactiver les avertissements de l'éditeur de liens spécifiques?


118

J'utilise une bibliothèque de CGAL qui, pendant la phase de liaison de ma compilation de code, produit de nombreux avertissements de liaison de cette forme:

warning LNK4099: PDB 'vc80.pdb' was not found with 'gmp-vc80-mt-sgd.lib' or at 'vc80.pdb'; linking object as if no debug info

Comment désactiver cet avertissement de l'éditeur de liens spécifique sous Visual C ++ / Studio 2008?

Notez que je n'ai aucun contrôle sur la bibliothèque externe (CGAL) que j'utilise. Je ne peux / ne veux pas recompiler la bibliothèque externe. D'où la nécessité de corriger les messages de ma part.


1
Pour VS2005 / ignore: 4099 fonctionne bien.

/ ignore: 4099 fonctionne bien ici avec VS2008.
Tom

/ignore:4099fonctionne correctement dans Visual Studio 10 avec C ++. J'ai reçu l'avertissement LNK4099: PDB 'vc100.pdb' was not found with 'gtest_main-mdd.lib(gtest_main.obj)et j'ai réussi à le supprimer de cette façon.
Manolete


3
VS2013 accepte / ignore: 4099 très bien :)
mlvljr

Réponses:


101

Ajoutez ce qui suit comme option supplémentaire de l'éditeur de liens:

 /ignore:4099

C'est dans Propriétés-> Linker-> Ligne de commande


5
Je ne pense pas / ignorer existe. Les erreurs sont toujours répertoriées et / ignore n'est pas documentée dans MSDN. J'essaie de désactiver 4075 pour "avertissement LNK4075: ignorant '/ EDITANDCONTINUE' en raison de la spécification '/ INCREMENTAL: NO'."
Nick Desjardins

1
/ IGNORE n'est pas documenté mais est disponible. Voir connect.microsoft.com/VisualStudio/feedback/details/176188/…
Aaron Saarela

5
Ne fonctionne pas pour l'avertissement 4099 connect.microsoft.com/VisualStudio/feedback/details/176188/…
KindDragon

7
Vous pouvez utiliser / ignore: 4099 comme indicateur de l'éditeur de liens, mais il y a un hic. Malheureusement, Microsoft a décidé de faire de 4099 un avertissement non ignorable, vous devez donc patcher le link.exe. Cela semble un peu fou, mais il n'y a tout simplement pas d'autre moyen. Plus de détails ici: bottledlight.com/docs/lnk4099.html J'ai utilisé HxD comme éditeur hexadécimal, et suivre la description sur cette page fonctionnait bien avec VS10. La commande est toujours 4088, 4099, 4105.
Andreas Haferburg

2
Fonctionne sur VS 2015 (le projet utilise le jeu d'outils VS2013, je ne sais pas si cela fait une différence)
Assimilater

50

Mise à jour 16/10/2018

Apparemment, à partir de VS 2013, cet avertissement peut être désactivé. Voir le commentaire de @Mark Ransom.

Réponse originale

Vous ne pouvez pas désactiver cet avertissement spécifique.

Selon Geoff Chappell, l'avertissement 4099 est traité comme s'il était trop important pour être ignoré, même en l'utilisant conjointement avec / wx (qui traiterait les avertissements comme des erreurs et ignorerait l'avertissement spécifié dans d'autres situations)

Voici le texte pertinent du lien:

Avertissements pas tout à fait inignorables

Pour certains numéros d'avertissement, la spécification dans une option / ignore est acceptée mais pas nécessairement appliquée. Si l'avertissement se produit alors que l'option / wx n'est pas active, le message d'avertissement est toujours affiché, mais si l'option / wx est active, l'avertissement est ignoré. C'est comme si l'avertissement était jugé suffisamment important pour annuler une tentative d'ignorer, mais pas si l'utilisateur avait mis un prix trop élevé sur des avertissements non ignorés.

Les numéros d'avertissement suivants sont concernés:

4200, 4203, 4204, 4205, 4206, 4207, 4208, 4209, 4219, 4231 and 4237

Il ne dit pas "l'avertissement 4099 est trop important pour être ignoré"; il déduit cela du fait qu'il ne peut pas être désactivé. (Noté ici car il n'y a aucune information supplémentaire sur ce lien.)
Ben M

Mis à jour pour répondre à votre préoccupation @BenM
John Weldon

1
Cette réponse est ancienne , la désactivation de l'avertissement 4099 a bien fonctionné pour moi sur VS2017. Il ressort des commentaires ici qu'il peut être désactivé probablement à partir de VS2013.
Mark Ransom

10

(Pour mémoire et avant que le fil ne disparaisse sur les forums msdn) Vous ne pouvez pas désactiver l'avertissement (au moins sous VS2010) car il est sur la liste des avertissements qui ne peuvent pas être désactivés (donc / wd4099 ne fonctionnera pas) , mais ce que vous pouvez faire à la place, c'est patch link.exe (généralement C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ link.exe) pour le supprimer de ladite liste. Cela ressemble à un marteau-piqueur, je sais. Cela fonctionne cependant.

Par exemple, si vous souhaitez supprimer l'avertissement pour 4099, ouvrez link.exe avec un éditeur hexadécimal, allez à la ligne 15A0 qui lit 03 10 (petit boutien pour 4099) et remplacez-le par FF 00 (qui n'existe pas).


5
Vous devriez rechercher la séquence F8 0F 00 00 - 03 10 00 00 - 09 10 00 00 (4088, 4099, 4105 sous forme de mots doubles de 32 bits en petit boutiste). C'est la même chose dans amd64 / link.exe.
Andreas Haferburg

8

Pour le bénéfice des autres, je pensais inclure ce que j'ai fait.

Puisque vous ne pouvez pas faire en sorte que Visual Studio (2010 dans mon cas) ignore les avertissements LNK4204, mon approche était de lui donner ce qu'il voulait: les fichiers pdb. Comme j'utilisais des bibliothèques open source dans mon cas, j'ai déjà le code de construction des fichiers pdb.

MAIS, la valeur par défaut est de nommer tous les fichiers PDF de la même manière: vc100.pdb dans mon cas. Comme vous avez besoin d'un .pdb pour chaque .lib, cela crée un problème, surtout si vous utilisez quelque chose comme ImageMagik, qui crée environ 20 fichiers .lib statiques. Vous ne pouvez pas avoir 20 fichiers lib dans un répertoire (auquel l'éditeur de liens de votre application renvoie dans les bibliothèques) et avoir tous les 20 fichiers .pdb appelés la même chose.

Ma solution était d'aller reconstruire mes fichiers de bibliothèque statiques, et de configurer VS2010 pour nommer le fichier .pdb par rapport au PROJET. De cette façon, chaque .lib obtient un .pdb nommé de manière similaire, et vous pouvez placer tous les LIB et PDB dans un répertoire pour que votre projet les utilise.

Donc pour la configuration "Debug", j'ai édité:

Propriétés-> Propriétés de configuration -> C / C ++ -> Fichiers de sortie -> Nom du fichier de la base de données du programme à partir de

$ (IntDir) vc $ (PlatformToolsetVersion) .pdb

être la valeur suivante:

$ (OutDir) vc $ (PlatformToolsetVersion) D $ (ProjectName) .pdb

Maintenant, plutôt que quelque part dans le répertoire intermédiaire, les fichiers .pdb sont écrits dans le répertoire de sortie, où les fichiers .lib sont également écrits, ET surtout, ils sont nommés avec un suffixe de nom de projet D + . Cela signifie que chaque projet de bibliothèque produit un projet .lib et un .pdb spécifique au projet.

Je suis maintenant en mesure de copier tous mes fichiers .lib de version, mes fichiers de débogage .lib et les fichiers de débogage .pdb en un seul endroit sur mon système de développement, et le projet qui utilise cette bibliothèque tierce en mode débogage a le pdb fichiers dont il a besoin en mode débogage.


2
Je dirais que c'est la réponse à la question. La suggestion de PATCHING THE LINKER que de nombreuses réponses contiennent est stupide. Même si Microsoft a «tort» de rendre cet avertissement impossible à ignorer.
Tamás Szelei

3
C'est la bonne réponse SI vous compilez la bibliothèque à partir des sources. Mais certains programmes ont des dépendances sur des bibliothèques commerciales qui n'incluent pas de fichiers .pdb, donc générer un fichier .pdb pour eux n'est pas une option.
Bryce Wagner

3

Je soupçonne / ignore est une option VC6 link.exe. pour l'éditeur de liens VS2005 et VS2008, il n'y a pas d'option documentée / ignorer disponible, mais l'éditeur de liens semble ignorer simplement l'option "/ ignore: XXX", aucune erreur et aucun effet.


2
En fait, il est recommandé de ne pas ignorer les avertissements de l'éditeur de liens, de sorte que l'indicateur Ignorer a été désactivé après VC6: bytes.com/topic/net/answers
Gyuri

/ ignore peut être réutilisé dans VS2013.
Fernando Gonzalez Sanchez

1

Le fichier PDB est généralement utilisé pour stocker les informations de débogage. Cet avertissement est probablement dû au fait que le fichier vc80.pdbest introuvable lors de la liaison du fichier objet cible. Lisez l'entrée MSDN sur LNK4099 ici .

Vous pouvez également désactiver la génération d'informations de débogage à partir du champ Propriétés du projet> Éditeur de liens> Débogage> Générer les informations de débogage.


3
La désactivation des informations de débogage résout les avertissements de l'éditeur de liens, mais les points d'arrêt ne fonctionnent pas sans informations de débogage. Ce n'est pas très utile pour moi.
Ashwin Nanjappa

2
Désactiver les avertissements n'est jamais la bonne chose à faire. Répare les. Vous devez trouver le fichier pdb et veiller à ce qu'il soit copié à l'emplacement approprié.
dirkgently

Soupir, c'est vrai! Malheureusement, dans ce cas, je ne trouve pas ce fichier pdb.
Ashwin Nanjappa

1
vc80.pdb est simplement le nom pdb par défaut pour vc8. Cet avertissement signifie simplement qu'aucune information de débogage n'est disponible pour la bibliothèque CGAL. Il est prudent d'ignorer.
JoeG

1

EDIT: n'utilisez pas vc80 / Visual Studio 2005, mais les versions Visual Studio 2008 / vc90 de la bibliothèque CGAL (peut-être à partir d' ici ).

Avertissement des outils Éditeur de liens LNK4099 :

Vous pouvez également compiler avec / Z7, de sorte que pdb n'a pas besoin d'être utilisé, ou supprimer l'option de l'éditeur de liens / DEBUG si vous n'avez pas de fichiers .pdb pour les objets que vous liez.


2
Merci. La compilation avec / Z7 demande toujours le fichier .pdb de la bibliothèque CGAL. / DEBUG résout les avertissements de l'éditeur de liens, mais les points d'arrêt ne fonctionnent pas sans informations de débogage.
Ashwin Nanjappa

1

Vous ne pouvez pas désactiver l'avertissement 4099 de l'éditeur de liens, comme l'a dit @John Weldon.

Vous devez reconstruire la bibliothèque avec quelques modifications de configuration du projet. Vous avez plusieurs options:

  • Enregistrer le fichier PDB avec les informations de débogage est le même dossier où vous enregistrez le fichier .lib. Définissez la valeur "$ (OutDir) $ (TargetName) .pdb" sur Properties-> C / C ++ -> Output Files-Program Database File Name
  • Enregistrez les informations de débogage dans le fichier .lib. Définissez la valeur "C7 compatible (/ Z7)" sur Propriétés-> C / C ++ -> Général-> Format des informations de débogage
  • Désactivez les informations de débogage de génération pour cette bibliothèque. Supprimer la valeur de Propriétés-> C / C ++ -> Général-> Format des informations de débogage
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.