Visual C ++: Wie deaktiviere ich bestimmte Linker-Warnungen?

118

Ich verwende eine Bibliothek von CGAL, die während der Verknüpfungsphase meiner Code-Kompilierung viele Verknüpfungswarnungen dieser Form erzeugt:

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

Wie deaktiviere ich diese spezielle Linker-Warnung unter Visual C ++ / Studio 2008?

Beachten Sie, dass ich keine Kontrolle über die externe (CGAL) Bibliothek habe, die ich verwende. Ich kann / möchte nicht mit dem Neukompilieren der externen Bibliothek beginnen. Daher die Notwendigkeit, die Nachrichten an meinem Ende zu reparieren.

Ashwin Nanjappa
quelle
1
Für VS2005 / Ignorieren: 4099 funktioniert einwandfrei.
/ ignore: 4099 funktioniert hier gut mit VS2008.
Tom
/ignore:4099funktioniert gut in Visual Studio 10 mit C ++. Ich habe die Warnung erhalten LNK4099: PDB 'vc100.pdb' was not found with 'gtest_main-mdd.lib(gtest_main.obj)und es geschafft, sie auf diese Weise zu entfernen.
Manolete
3
VS2013 akzeptiert / ignorieren: 4099 ganz gut :)
mlvljr

Antworten:

101

Fügen Sie Folgendes als zusätzliche Linkeroption hinzu:

 /ignore:4099

Dies ist in Eigenschaften-> Linker-> Befehlszeile

Aaron Saarela
quelle
5
Ich glaube nicht, dass es existiert. Die Fehler werden weiterhin aufgelistet und / ignore wird in MSDN nicht dokumentiert. Ich versuche, 4075 für "Warnung LNK4075: Ignorieren von '/ EDITANDCONTINUE' aufgrund der Spezifikation '/ INCREMENTAL: NO'" zu deaktivieren.
Nick Desjardins
1
/ IGNORE ist nicht dokumentiert, aber verfügbar. Siehe connect.microsoft.com/VisualStudio/feedback/details/176188/…
Aaron Saarela
5
Funktioniert nicht für die Warnung 4099 connect.microsoft.com/VisualStudio/feedback/details/176188/…
KindDragon
7
Sie können 4099 als Linker-Flag verwenden / ignorieren, aber es gibt einen Haken. Leider hat Microsoft beschlossen, 4099 zu einer nicht zu ignorierenden Warnung zu machen, sodass Sie die link.exe patchen müssen. Klingt irgendwie verrückt, aber es gibt einfach keinen anderen Weg. Weitere Details finden Sie hier: Bottledlight.com/docs/lnk4099.html Ich habe HxD als Hex-Editor verwendet und das Befolgen der Beschreibung auf dieser Seite hat mit VS10 einwandfrei funktioniert. Die Bestellung ist noch 4088, 4099, 4105.
Andreas Haferburg
2
Funktioniert auf VS 2015 (das Projekt verwendet das VS2013-Toolset, nicht sicher, ob dies einen Unterschied macht)
Assimilater
50

Update 2018-10-16

Berichten zufolge kann diese Warnung ab VS 2013 deaktiviert werden. Siehe den Kommentar von @Mark Ransom.

Ursprüngliche Antwort

Sie können diese spezielle Warnung nicht deaktivieren.

Laut Geoff Chappell wird die 4099-Warnung so behandelt, als wäre sie zu wichtig, um sie zu ignorieren, selbst wenn sie in Verbindung mit / wx verwendet wird (was Warnungen als Fehler behandeln und die angegebene Warnung in anderen Situationen ignorieren würde).

Hier ist der relevante Text aus dem Link:

Nicht ganz unbedeutende Warnungen

Für einige Warnnummern wird die Angabe in einer / ignore-Option akzeptiert, aber nicht unbedingt befolgt. Sollte die Warnung auftreten, während die Option / wx nicht aktiv ist, wird die Warnmeldung weiterhin angezeigt. Wenn die Option / wx jedoch aktiv ist, wird die Warnung ignoriert. Es ist, als ob die Warnung für wichtig genug gehalten wird, um einen Versuch, sie zu ignorieren, außer Kraft zu setzen, aber nicht, wenn der Benutzer nicht zu hohe Warnungen zu teuer bewertet hat.

Folgende Warnnummern sind betroffen:

4200, 4203, 4204, 4205, 4206, 4207, 4208, 4209, 4219, 4231 and 4237
John Weldon
quelle
Er sagt nicht "die 4099-Warnung ist zu wichtig, um sie zu ignorieren"; er schließt daraus die Tatsache, dass es nicht ausgeschaltet werden kann. (Hier vermerkt, da dieser Link keine zusätzlichen Informationen enthält.)
Ben M
Aktualisiert, um Ihr Anliegen anzusprechen @BenM
John Weldon
1
Diese Antwort ist alt , das Deaktivieren der Warnung 4099 hat für mich auf VS2017 gut funktioniert. Aus den Kommentaren hier geht hervor, dass es wahrscheinlich ab VS2013 deaktiviert werden kann.
Mark Ransom
10

(Für den Datensatz und bevor der Thread in den msdn-Foren verschwindet) Sie können die Warnung nicht deaktivieren (zumindest unter VS2010), da sie in der Liste der Warnungen aufgeführt ist, die nicht deaktiviert werden können (daher funktioniert / wd4099 nicht). Sie können jedoch stattdessen die Datei link.exe (normalerweise C: \ Programme (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ link.exe) patchen, um sie aus dieser Liste zu entfernen. Klingt wie ein Presslufthammer, ich weiß. Es funktioniert aber.

Wenn Sie beispielsweise die Warnung für 4099 entfernen möchten, öffnen Sie link.exe mit einem Hex-Editor, gehen Sie zu Zeile 15A0 mit der Aufschrift 03 10 (Little Endian für 4099) und ersetzen Sie sie durch FF 00 (die nicht vorhanden ist).

Gurg Hackpof
quelle
5
Sie sollten nach der Sequenz F8 0F 00 00 - 03 10 00 00 - 09 10 00 00 (4088, 4099, 4105 als 32-Bit-Doppelwörter in Little Endian) suchen. In der amd64 / link.exe ist es genauso.
Andreas Haferburg
8

Zum Wohle anderer würde ich einschließen, was ich getan habe.

Da Sie Visual Studio (in meinem Fall 2010) nicht dazu bringen können, die LNK4204-Warnungen zu ignorieren, bestand mein Ansatz darin, ihm das zu geben, was er wollte: die PDF-Dateien. Da ich in meinem Fall Open Source-Bibliotheken verwendet habe, habe ich den Code, der die PDF-Dateien erstellt.

ABER standardmäßig werden alle PDF-Dateien gleich benannt: in meinem Fall vc100.pdb. Da Sie für jede .lib eine .pdb benötigen, entsteht ein Problem, insbesondere wenn Sie ImageMagik verwenden, mit dem etwa 20 statische .lib-Dateien erstellt werden. Sie können nicht 20 lib-Dateien in einem Verzeichnis haben (von denen der Linker Ihrer Anwendung auf Links in den Bibliotheken verweist) und alle 20 .pdb-Dateien haben dasselbe aufgerufen.

Meine Lösung bestand darin, meine statischen Bibliotheksdateien neu zu erstellen und VS2010 so zu konfigurieren, dass die PDF-Datei in Bezug auf das PROJEKT benannt wird. Auf diese Weise erhält jede .lib eine ähnlich benannte .pdb, und Sie können alle LIBs und PDBs in einem Verzeichnis ablegen, damit Ihr Projekt sie verwenden kann.

Für die "Debug" -Konfiguration habe ich Folgendes bearbeitet:

Eigenschaften-> Konfigurationseigenschaften -> C / C ++ -> Ausgabedateien -> Name der Programmdatenbank von

$ (IntDir) vc $ (PlatformToolsetVersion) .pdb

der folgende Wert sein:

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

Anstatt irgendwo im Zwischenverzeichnis werden die PDF-Dateien in das Ausgabeverzeichnis geschrieben, in das auch die LIB-Dateien geschrieben werden, und vor allem werden sie mit dem Suffix D + Projektname benannt . Dieses Mittel jeder Bibliothek Projekt produduces ein Projekt Lib und eine projektspezifische PDB.

Ich kann jetzt alle meine Release-LIB-Dateien, meine Debug-LIB-Dateien und die Debug-PDF-Dateien an einen Ort auf meinem Entwicklungssystem kopieren. Das Projekt, das diese Drittanbieter-Bibliothek im Debug-Modus verwendet, verfügt über die PDF-Datei Dateien, die es im Debug-Modus benötigt.

Minok
quelle
2
Ich würde sagen, das ist die Antwort auf die Frage. Der Vorschlag von PATCHING THE LINKER, den viele Antworten enthalten, ist Unsinn. Auch wenn Microsoft "falsch" ist, diese Warnung nicht zu ignorieren.
Tamás Szelei
3
Dies ist die richtige Antwort, wenn Sie die Bibliothek aus dem Quellcode kompilieren. Einige Programme sind jedoch von kommerziellen Bibliotheken abhängig, die keine .pdb-Dateien enthalten. Daher ist das Generieren einer .pdb-Datei für sie keine Option.
Bryce Wagner
3

Ich vermute / ignorieren ist eine VC6 link.exe Option. Für den Linker von VS2005 und VS2008 ist keine Option zum Dokumentieren / Ignorieren verfügbar. Der Linker sieht jedoch so aus, als würde die Option "/ ignore: XXX" ignoriert, kein Fehler und keine Auswirkung.

zhaorufei
quelle
2
Tatsächlich ist es empfehlenswert, Linker-Warnungen nicht zu ignorieren, daher wurde das Ignorier-Flag nach VC6 deaktiviert: bytes.com/topic/net/answers/…
Gyuri
/ ignore kann in VS2013 wieder verwendet werden.
Fernando Gonzalez Sanchez
1

Die PDB-Datei wird normalerweise zum Speichern von Debug-Informationen verwendet. Diese Warnung wird wahrscheinlich verursacht, weil die Datei vc80.pdbbeim Verknüpfen der Zielobjektdatei nicht gefunden wird. Lesen Sie den MSDN - Eintrag auf LNK4099 hier .

Alternativ können Sie die Generierung von Debug-Informationen über das Feld Projekteigenschaften> Linker> Debugging> Debug-Informationen generieren deaktivieren.

dirkgently
quelle
3
Durch Deaktivieren der Debug-Informationen werden die Linker-Warnungen behoben, aber dann funktionieren Haltepunkte ohne Debug-Informationen nicht. Das ist für mich nicht sehr nützlich.
Ashwin Nanjappa
2
Das Ausschalten von Warnungen ist niemals das Richtige. Repariere sie. Sie müssen die PDF-Datei finden und dafür sorgen, dass sie an den richtigen Speicherort kopiert wird.
dirkgently
Seufz, das ist wahr! Leider kann ich diese PDF in diesem Fall nicht finden.
Ashwin Nanjappa
1
vc80.pdb ist nur der Standard-PDF-Name für vc8. Diese Warnung bedeutet lediglich, dass für die CGAL-Bibliothek keine Debug-Informationen verfügbar sind. Es ist sicher zu ignorieren.
JoeG
1

BEARBEITEN: Verwenden Sie nicht vc80 / Visual Studio 2005, sondern Visual Studio 2008 / vc90-Versionen der CGAL-Bibliothek (möglicherweise von hier aus ).

Linker Tools Warnung LNK4099 :

Sie können auch mit / Z7 kompilieren, sodass die PDF-Datei nicht verwendet werden muss, oder die Linker-Option / DEBUG entfernen, wenn Sie keine PDF-Dateien für die zu verknüpfenden Objekte haben.

Axt.
quelle
2
Vielen Dank. Beim Kompilieren mit / Z7 wird weiterhin nach der PDF-Datei der CGAL-Bibliothek gefragt. / DEBUG löst die Linker-Warnungen, aber dann funktionieren Haltepunkte ohne Debug-Informationen nicht.
Ashwin Nanjappa
1

Sie können die Linker-Warnung 4099 nicht deaktivieren, wie @ John Weldon sagte.

Sie sollten die Bibliothek mit einigen Änderungen an der Projektkonfiguration neu erstellen. Sie haben mehrere Möglichkeiten:

  • PDB-Datei mit Debug-Informationen speichern ist derselbe Ordner, in dem Sie die LIB-Datei speichern. Setzen Sie den Wert "$ (OutDir) $ (TargetName) .pdb" auf Eigenschaften-> C / C ++ -> Name der Ausgabedatei-Programmdatenbankdatei
  • Speichern Sie die Debug-Informationen in der LIB-Datei. Setzen Sie den Wert "C7 kompatibel (/ Z7)" auf Eigenschaften-> C / C ++ -> Allgemein-> Debug-Informationsformat
  • Deaktivieren Sie die Debug-Informationen zur Generierung für diese Bibliothek. Entfernen Sie den Wert aus Eigenschaften-> C / C ++ -> Allgemein-> Debug-Informationsformat
KindDragon
quelle