2014-10-09 3 views
18

alcuni progetti in mia soluzione produrre questo linker avvertimento:Cosa causa l'avviso del linker "MSIL .netmodule o modulo compilato con/GL trovato, riavvio del collegamento con/LTCG"?

MSIL .netmodule or module compiled with /GL found; restarting link with /LTCG; add /LTCG to the link command line to improve linker performance 

sto usando Visual Studio 2013 Aggiornamento 3. Io non sono ancora stati in grado di identificare qualcosa di particolare a quei progetti che potrebbero causare questo.

Che cosa si tratta di quei progetti che produce questo?


Ho guardato questo: http://msdn.microsoft.com/en-us/library/k669k83h.aspx ma io non sono a conoscenza che stiamo usando qualsiasi CLR, il codice gestito,/LN o/NOASSEMBLY.

+4

mia sfera di cristallo dice che hai trovato questo avvertimento nella build di debug del tuo progetto dal collegamento di un .lib statico creato con le impostazioni di configurazione di Release. Che ha/GL attivato per impostazione predefinita. Di solito sono brutte notizie al di là di questo avvertimento, YMMV. –

risposta

12

Ho riscontrato lo stesso errore e ho impiegato parecchio tempo a cercare di risolverlo. Alla fine, ho capito che è apparso a causa dell'uso dell'opzione "Ottimizzazione del programma intero" in una delle mie librerie di dipendenze.

Per impostazione predefinita, questa opzione è impostata su "Sì" nei progetti appena creati. Quando l'ho modificato in "No" e ricompilato tutte le dipendenze, l'avviso è scomparso. Ho una soluzione C++ puramente nativa senza alcun codice gestito.

da risolvere, le impostazioni di progetto aperti di tutti i progetti di dipendenza e controllare l'impostazione:

Proprietà di configurazione> C/C++> Ottimizzazione> intero programma di ottimizzazione

Assicurarsi che sia impostato su "No" in tutto il mondo.

+1

Non proprio. Mentre questo fa sparire l'avviso, disabilita anche diverse ottimizzazioni. È meglio abilitare l'impostazione "Generazione codice tempo collegamento". –

+1

L'impostazione "Generazione codice tempo collegamento" è un'alternativa migliore. Tuttavia, non è sempre conveniente perché non è un'impostazione predefinita. Immagina di fornire una biblioteca per un vasto pubblico. È necessario scrivere quindi un'istruzione sulla regolazione delle impostazioni in ogni progetto finale che consuma la libreria. I potenziali utenti della biblioteca potrebbero diventare sospettosi e semplicemente selezionare di non utilizzarlo nei loro progetti. La modifica delle impostazioni nelle opzioni C++ danneggia l'efficienza, ma consente di raggiungere la compatibilità con i valori predefiniti. Quale scenario scegliere ognuno dovrebbe decidere individualmente in base alle circostanze concrete. –

+0

Erm, "Generazione del codice di tempo del collegamento" è l'impostazione predefinita nelle build di rilascio, altrimenti non avrebbe senso avere l'opzione "Whole Program Optimization" come predefinita. –

2

trovo lo stesso errore va via dicendo il linker su/impostazione GL si è utilizzato:

Set ... Proprietà di configurazione/Linker/Ottimizzazione/Collegamento Time Code Generation Per ... One delle impostazioni non predefinite

Forse https://msdn.microsoft.com/en-us/library/xbf3tbeh.aspx è di qualche utilità?

Neil

0

Questo messaggio mostra un sacco, che è davvero destare sospetti. Io uso un foglio di proprietà che indica sia/GL e/LTCG. Il progetto non sta usando nessuna libreria esterna. E ottengo questo messaggio, che non ha alcun senso. Scompare, se vado alle proprietà del progetto e specificare "Usa la generazione del codice del tempo di collegamento" di nuovo da lì. Non cambia la riga di comando o altro, ma rende felice VC ...

21

Ho avuto lo stesso problema, quindi ho fatto qualche ricerca.

Secondo https://msdn.microsoft.com/en-us/library/0zza0de8.aspx:

Se si compila il programma con/GL e/c, è necessario utilizzare l'opzione linker/LTCG per creare il file di output.

Così il messaggio può essere un po 'fuorviante - il problema non è il MSIL .netmodule, ma moduli compilati con /GL

Quando si utilizza /GL, si dice al compilatore di ritardare la generazione di un codice e cioè intorno bounderies funzione , al fine di ottimizzarli. LTCG indica al linker di generare (e ottimizzare) il codice mancante. In caso contrario, il programma non verrà eseguito come previsto.

Fondamentalmente, i due interruttori devono essere utilizzati insieme (se utilizzati). Si applicano a diverse parti della build: una per la compilazione e l'altra per il collegamento.

Per completezza:

  • /GL è controllato da Proprietà di configurazione> C/C++> Ottimizzazione> intero programma di ottimizzazione

  • /LTCG è controllato da Proprietà di configurazione> Linker> Ottimizzazione> Ottimizzazione intero programma

Nelle versioni successive,

  • /LTCG è controllato da Proprietà di configurazione> Linker> Ottimizzazione> Collegamento Time Code Generation/Usa collegamento Time Code Generation (/ LTCG)
Problemi correlati