Avviso degli strumenti del linker LNK4221
Questo file di oggetti non definisce simboli pubblici non definiti in precedenza, quindi non verrà usato da alcuna operazione di collegamento che utilizza questa libreria
Si considerino i due frammenti di codice seguenti: a.cpp
// a.cpp
#include <atlbase.h>
E b.cpp
:
// b.cpp
#include <atlbase.h>
int function()
{
return 0;
}
Per compilare i file e creare due file oggetto, eseguire cl /c a.cpp b.cpp
al prompt dei comandi. Se si collegano i file oggetto eseguendo link /lib /out:test.lib a.obj b.obj
, si riceverà l'avviso LNK4221. Se si collegano gli oggetti eseguendo link /lib /out:test.lib b.obj a.obj
, non si riceverà un avviso.
Non viene generato alcun avviso nel secondo scenario perché il linker opera in modo LIFO (Last-In First Out). Nel primo scenario, b.obj
viene elaborato prima a.obj
di e a.obj
non dispone di nuovi simboli da aggiungere. Indicando al linker di elaborare a.obj
prima di tutto, è possibile evitare l'avviso.
Una causa comune di questo errore è quando due file di origine specificano l'opzione /Yc
(Crea file di intestazione precompilato) con lo stesso nome di file di intestazione specificato nel campo Intestazione precompilata. Una causa comune di questo problema riguarda pch.h
poiché, per impostazione predefinita, pch.cpp
include pch.h
e non aggiunge nuovi simboli. Se un altro file di origine include pch.h
/Yc
e il file associato .obj
viene elaborato prima pch.obj
di , il linker genererà LNK4221.
Una causa comune di questo errore è quando due file di origine specificano l'opzione /Yc
(Crea file di intestazione precompilato) con lo stesso nome di file di intestazione specificato nel campo Intestazione precompilata. Una causa comune di questo problema riguarda stdafx.h
poiché, per impostazione predefinita, stdafx.cpp
include stdafx.h
e non aggiunge nuovi simboli. Se un altro file di origine include stdafx.h
/Yc
e il file associato .obj
viene elaborato prima stdafx.obj
di , il linker genererà LNK4221.
Un modo per risolvere questo problema consiste nel assicurarsi che per ogni intestazione precompilata sia presente un solo file di origine che lo include con /Yc
. Tutti gli altri file di origine devono usare intestazioni precompilate. Per altre informazioni su come modificare questa impostazione, vedere /Yu
(Usare il file di intestazione precompilato).