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.objdi 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.objdi , 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.objdi , 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).