Visual C ++: come disabilitare gli avvisi specifici del linker?


118

Sto utilizzando una libreria di CGAL che durante la fase di collegamento della mia compilazione del codice produce molti avvisi di collegamento di questo modulo:

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

Come faccio a disattivare questo avviso specifico del linker in Visual C ++ / Studio 2008?

Notare che non ho alcun controllo sulla libreria esterna (CGAL) che sto utilizzando. Non posso / non voglio entrare nella ricompilazione della libreria esterna. Da qui la necessità di correggere i messaggi da parte mia.


1
Per VS2005 / ignore: 4099 funziona bene.

/ ignore: 4099 funziona bene qui con VS2008.
Tom,

/ignore:4099funziona bene in Visual Studio 10 con C ++. Ho ricevuto l'avviso LNK4099: PDB 'vc100.pdb' was not found with 'gtest_main-mdd.lib(gtest_main.obj)e sono riuscito a rimuoverlo in questo modo.
Manolete


3
VS2013 accetta / ignora: 4099 benissimo :)
mlvljr

Risposte:


101

Aggiungi quanto segue come ulteriore opzione di linker:

 /ignore:4099

Questo è in Proprietà-> Linker-> Riga di comando


5
Non penso / ignoro esista. Gli errori sono ancora elencati e / ignore non è documentato in MSDN. Sto provando a disabilitare 4075 per "avviso LNK4075: ignora" / EDITANDCONTINUE "a causa di" / INCREMENTAL: NO "specifica."
Nick Desjardins

1
/ IGNORE non è documentato ma è disponibile. Vedi connect.microsoft.com/VisualStudio/feedback/details/176188/…
Aaron Saarela


7
Puoi usare / ignore: 4099 come flag del linker, ma c'è un problema. Sfortunatamente, Microsoft ha deciso di rendere 4099 un avviso non ignorabile, quindi devi patchare il link.exe. Sembra un po 'folle, ma semplicemente non c'è altro modo. Maggiori dettagli qui: bottledlight.com/docs/lnk4099.html Ho usato HxD come editor esadecimale e seguendo la descrizione in quella pagina ha funzionato bene con VS10. L'ordine è ancora 4088, 4099, 4105.
Andreas Haferburg

2
Funziona su VS 2015 (il progetto utilizza il set di strumenti VS2013, non so se questo fa la differenza)
Assimilater

50

Aggiornamento 2018-10-16

Secondo quanto riferito, a partire da VS 2013, questo avviso può essere disabilitato. Vedi il commento di @Mark Ransom.

Risposta originale

Non puoi disabilitare quell'avviso specifico.

Secondo Geoff Chappell l'avviso 4099 viene trattato come se fosse troppo importante per essere ignorato, anche utilizzando insieme a / wx (che tratterebbe gli avvisi come errori e ignorerebbe l'avviso specificato in altre situazioni)

Ecco il testo pertinente dal link:

Avvertimenti non proprio non ignorabili

Per alcuni numeri di avviso, la specifica in un'opzione / ignore è accettata ma non necessariamente applicata. Se l'avviso si verifica mentre l'opzione / wx non è attiva, il messaggio di avviso viene comunque visualizzato, ma se l'opzione / wx è attiva, l'avviso viene ignorato. È come se l'avviso fosse ritenuto abbastanza importante da ignorare un tentativo di ignorarlo, ma non se l'utente ha attribuito un prezzo troppo alto agli avvisi non ignorati.

Sono interessati i seguenti numeri di avviso:

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

Non dice "l'avviso 4099 è troppo importante per essere ignorato"; lo deduce dal fatto che non può essere spento. (Annotato qui poiché non ci sono informazioni extra a quel link.)
Ben M

Aggiornato per rispondere alle tue preoccupazioni @BenM
John Weldon

1
Questa risposta è vecchia , la disabilitazione dell'avviso 4099 ha funzionato bene per me su VS2017. Dai commenti qui appare che può essere disabilitato probabilmente a partire da VS2013.
Mark Ransom

10

(Per la cronaca e prima che il thread scompaia sui forum di msdn) Non puoi disabilitare l'avviso (almeno sotto VS2010) perché è nell'elenco degli avvisi che non possono essere disabilitati (quindi / wd4099 non funzionerà) , ma quello che puoi fare invece è patch link.exe (solitamente C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ bin \ link.exe) per rimuoverlo da detto elenco. Sembra un martello pneumatico, lo so. Però funziona.

Ad esempio, se vuoi rimuovere l'avviso per 4099, apri link.exe con un editor esadecimale, vai alla riga 15A0 che legge 03 10 (little endian per 4099) e sostituiscilo con FF 00 (che non esiste.)


5
Dovresti cercare la sequenza F8 0F 00 00 - 03 10 00 00 - 09 10 00 00 (4088, 4099, 4105 come doppie parole a 32 bit in little endian). È lo stesso in amd64 / link.exe.
Andreas Haferburg

8

A beneficio degli altri, ho pensato di includere ciò che ho fatto.

Dal momento che non è possibile far sì che Visual Studio (2010 nel mio caso) ignori gli avvisi LNK4204, il mio approccio è stato quello di dargli ciò che voleva: i file pdb. Dato che nel mio caso stavo usando le librerie open source, ho già il codice che crea i file pdb.

MA, l'impostazione predefinita è denominare tutti i file PDF nella stessa cosa: vc100.pdb nel mio caso. Poiché hai bisogno di un .pdb per ogni .lib, questo crea un problema, specialmente se stai usando qualcosa come ImageMagik, che crea circa 20 file .lib statici. Non è possibile avere 20 file lib in una directory (a cui fa riferimento il linker dell'applicazione per collegarsi nelle librerie) e tutti i 20 file .pdb si chiamano la stessa cosa.

La mia soluzione era quella di ricostruire i miei file di libreria statica e configurare VS2010 per denominare il file .pdb rispetto al PROGETTO. In questo modo, ogni .lib ottiene un .pdb dal nome simile e puoi inserire tutti i LIB e PDB in una directory per il tuo progetto da utilizzare.

Quindi per la configurazione "Debug", ho modificato:

Proprietà-> Proprietà di configurazione -> C / C ++ -> File di output -> Nome file database programma da

$ (IntDir) vc $ (PlatformToolsetVersion) PDB

essere il seguente valore:

$ (OutDir) vc $ (PlatformToolsetVersion) D $ (ProjectName) PDB

Ora invece che da qualche parte nella directory intermedia, i file .pdb vengono scritti nella directory di output, dove vengono scritti anche i file .lib e, cosa più importante, sono denominati con un suffisso del nome del progetto D + . Ciò significa che ogni progetto di libreria produce un .lib del progetto e un .pdb specifico del progetto.

Ora sono in grado di copiare tutti i miei file .lib di rilascio, i miei file .lib di debug e i file .pdb di debug in un unico posto sul mio sistema di sviluppo e il progetto che utilizza quella libreria di terze parti in modalità di debug, ha il pdb file necessari in modalità debug.


2
Direi che questa è la risposta alla domanda. Il suggerimento di PATCHING THE LINKER che molte risposte contengono è asinino. Anche se Microsoft ha "torto" nel rendere questo avviso non ignorabile.
Tamás Szelei

3
Questa è la risposta corretta SE stai compilando la libreria dal sorgente. Ma alcuni programmi hanno dipendenze da librerie commerciali che non includono file .pdb, quindi generare un file .pdb per loro non è un'opzione.
Bryce Wagner

3

Sospetto / ignoro sia un'opzione VC6 link.exe. per VS2005 e il linker di VS2008 non è disponibile alcuna opzione documentato / ignora, ma il linker sembra ignorare semplicemente l'opzione "/ ignore: XXX", nessun errore e nessun effetto.


2
In effetti, è incoraggiato a non ignorare gli avvisi del linker, quindi il flag di ignora è stato disabilitato dopo VC6: bytes.com/topic/net/answers/…
Gyuri

/ ignore può essere utilizzato di nuovo in VS2013.
Fernando Gonzalez Sanchez

1

Il file PDB viene in genere utilizzato per memorizzare le informazioni di debug. Questo avviso è causato probabilmente perché il file vc80.pdbnon viene trovato quando si collega il file dell'oggetto di destinazione. Leggi la voce MSDN su LNK4099 qui .

In alternativa, è possibile disattivare la generazione delle informazioni di debug dal campo Proprietà progetto> Linker> Debug> Genera informazioni di debug.


3
La disattivazione delle informazioni di debug risolve gli avvisi del linker, ma i punti di interruzione non funzionano senza le informazioni di debug. Non è molto utile per me.
Ashwin Nanjappa

2
Disattivare gli avvisi non è mai la cosa giusta da fare. Aggiustali. Devi trovare il pdb e assicurarti che venga copiato nella posizione corretta.
Direttamente il

Sigh, è vero! Purtroppo in questo caso, non riesco a trovare quel PDB.
Ashwin Nanjappa

1
vc80.pdb è solo il nome PDB predefinito per vc8. Questo avviso significa semplicemente che non sono disponibili informazioni di debug per la libreria CGAL. È sicuro ignorare.
JoeG

1

EDIT: non utilizzare vc80 / Visual Studio 2005, ma le versioni Visual Studio 2008 / vc90 della libreria CGAL (forse da qui ).

Avviso degli strumenti del linker LNK4099 :

Potresti anche compilare con / Z7, quindi non è necessario utilizzare pdb, o rimuovere l'opzione / DEBUG linker se non hai file .pdb per gli oggetti che stai collegando.


2
Grazie. La compilazione con / Z7 richiede ancora il file .pdb della libreria CGAL. / DEBUG risolve gli avvisi del linker, ma i punti di interruzione non funzionano senza le informazioni di debug.
Ashwin Nanjappa

1

Non è possibile disabilitare l'avviso 4099 del linker, come ha detto @John Weldon.

Dovresti ricostruire la libreria con alcune modifiche alla configurazione del progetto. Hai diverse opzioni:

  • Salva il file PDB con le informazioni di debug è la stessa cartella in cui salvi il file .lib. Imposta il valore "$ (OutDir) $ (TargetName) .pdb" su Proprietà-> C / C ++ -> File di output-Nome file del database del programma
  • Salva le informazioni di debug nel file .lib. Imposta il valore "compatibile C7 (/ Z7)" su Proprietà-> C / C ++ -> Generale-> Formato informazioni di debug
  • Disabilita la generazione delle informazioni di debug per questa libreria. Rimuovi il valore da Proprietà-> C / C ++ -> Generale-> Formato informazioni di debug
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.