Avviso degli strumenti del linker LNK4049
simbolo 'symbol' definito in 'filename.obj' viene importato
__declspec(dllimport) è stato specificato per il simbolo anche se il simbolo è definito nel file di oggetti filename.obj nella stessa immagine. Rimuovere il modificatore per risolvere l'avviso __declspec(dllimport)
.
Osservazioni:
Questo avviso viene generato dal linker quando si definisce un simbolo in un file di oggetto e lo si fa riferimento usando il modificatore di __declspec(dllimport)
dichiarazione in un altro.
Avviso LNK4049 è una versione più generale dell'avviso degli strumenti del linker LNK4217. Il linker genera un avviso LNK4049 quando non riesce a determinare quale funzione o file oggetto fa riferimento al simbolo importato.
I casi comuni in cui vengono generati LNK4049 anziché LNK4217 sono:
Quando si usa l'opzione /INCREMENTAL .
Quando si usa l'opzione /LTCG .
Per risolvere LNK4049, provare una delle procedure seguenti:
Rimuovere il
__declspec(dllimport)
modificatore dalla dichiarazione di inoltro del simbolo che ha attivato LNK4049. È possibile cercare simboli all'interno di un'immagine binaria usando l'utilità DUMPBIN . L'opzione DUMPBIN /SYMBOLS visualizza la tabella dei simboli COFF dell'immagine. Per altre informazioni sull'utilità DUMPBIN , vedere Informazioni di riferimento su DUMPBIN.Disabilitare temporaneamente il collegamento incrementale e l'ottimizzazione dell'intero programma. Quando viene ricompilata, l'applicazione genera un avviso LNK4217, che include il nome della funzione che fa riferimento al simbolo importato. Rimuovere il modificatore di
__declspec(dllimport)
dichiarazione dal simbolo importato e riabilitare il collegamento incrementale o l'ottimizzazione dell'intero programma in base alle esigenze.
Anche se il codice generato finale si comporta correttamente, il codice generato per chiamare la funzione importata è meno efficiente rispetto alla chiamata diretta della funzione. Questo avviso non viene visualizzato quando si esegue la compilazione usando l'opzione /clr .
Per altre informazioni sulle dichiarazioni di dati di importazione ed esportazione, vedere dllexport, dllimport.
Esempio
Il collegamento dei due moduli seguenti genererà LNK4049. Il primo modulo genera un file oggetto contenente una singola funzione esportata.
// LNK4049a.cpp
// compile with: /c
__declspec(dllexport) int func()
{
return 3;
}
Il secondo modulo genera un file di oggetto contenente una dichiarazione di inoltro alla funzione esportata nel primo modulo, insieme a una chiamata a questa funzione all'interno della main
funzione. Il collegamento di questo modulo con il primo modulo genererà LNK4049. Rimuovere il __declspec(dllimport)
modificatore dalla dichiarazione per risolvere l'avviso.
// LNK4049b.cpp
// compile with: /link /WX /LTCG LNK4049a.obj
// LNK4049 expected
__declspec(dllimport) int func();
// try the following line instead
// int func();
int main()
{
return func();
}
Vedi anche
Avviso degli strumenti del linker LNK4217
Avviso degli strumenti del linker LNK4286
dllexport, dllimport