Qual è il modo migliore per eliminare gli avvisi di MS Visual C ++ Linker: & # 8220; avviso LNK4221 & # 8221 ;?

StackOverflow https://stackoverflow.com/questions/1822887

Domanda

Ho un file sorgente CPP che utilizza #if / #endif per compilare completamente in determinate build. Tuttavia, questo genera il seguente avviso.

warning LNK4221: no public symbols found; archive member will be inaccessible

Stavo pensando di creare una macro per generare una variabile o funzione fittizia che non sarebbe stata effettivamente utilizzata, quindi questo errore sarebbe scomparso, ma voglio assicurarmi che non causi problemi come l'utilizzo della macro in più file che causano il bombardamento del linker su simboli moltiplicati.

Qual è il modo migliore per sbarazzarsi di questo avviso (senza semplicemente sopprimerlo nella riga di comando del linker)?

FWIW, sarei interessato a sapere come farlo sopprimendo anche l'avvertimento sulla riga di comando del linker, ma tutti i miei tentativi sembrano essere semplicemente ignorati dal linker e generare comunque l'errore.

Un altro requisito: la correzione deve essere in grado di resistere a build di singoli file o build di unità (combinare build di file CPP) poiché una delle nostre configurazioni di build è una build di massa (come una build di unità ma gruppi di file di massa anziché un unico file di unità principale).

È stato utile?

Soluzione 2

OK, la correzione che sto per usare è il suggerimento di Pavel con una piccola modifica. Il motivo per cui sto usando questa correzione è che è una macro facile da inserire e funzionerà in build di massa / build di unità e build normali:

Intestazione condivisa:

// The following macro "NoEmptyFile()" can be put into a file
// in order suppress the MS Visual C++ Linker warning 4221
//
// warning LNK4221: no public symbols found; archive member will be inaccessible
//
// This warning occurs on PC and XBOX when a file compiles out completely
// has no externally visible symbols which may be dependant on configuration
// #defines and options.

#define NoEmptyFile()   namespace { char NoEmptyFileDummy##__LINE__; }

File che può essere compilato completamente:

NoEmptyFile()
#if DEBUG_OPTION
      // code
#endif // DEBUG_OPTION

Altri suggerimenti

Usa uno spazio dei nomi anonimo:

namespace { char dummy; };

I simboli all'interno di tale spazio dei nomi hanno un collegamento esterno, quindi ci sarà qualcosa nella tabella di esportazione. D'altra parte, il nome dello spazio dei nomi stesso sarà distinto (puoi considerarlo come "generato casualmente") per ogni unità di traduzione, quindi nessun conflitto.

(Anche se la discussione è già vecchia e non posso commentare direttamente la risposta di Adisak), immagino che per far funzionare tutto ciò sia necessario un po 'di magia aggiuntiva per l'espansione delle macro:

#define TOKENPASTE(x, y) x ## y
#define TOKENPASTE2(x, y) TOKENPASTE(x, y)
#define NONEMPTY_TRANSLATION_UNIT char TOKENPASTE2(NoEmptyFileDummy, __LINE__);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top