Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Aggiornamento: novembre 2007
Messaggio di errore
riferimento al simbolo esterno 'simbolo' non risolto nella funzione 'funzione'
unresolved external symbol 'symbol' referenced in function 'function'
È stato rilevato un simbolo esterno non definito (symbol) in function. Per correggere questo errore, fornire una definizione per il simbolo o rimuovere il codice che fa riferimento a esso. Per ulteriori informazioni, vedere:
Nell'esempio seguente viene generato l'errore LNK2019:
// LNK2019.cpp
// LNK2019 expected
extern char B[100]; // B is not in avilable to the linker
int main() {
B[0] = ' ';
}
L'errore LNK2019 può inoltre verificarsi quando si dichiara un membro dati statici senza definirlo. Nell'esempio seguente viene generato l'errore LNK2019:
// LNK2019b.cpp
// LNK2019 expected
struct C {
static int s;
};
// Uncomment the following line to resolve.
// int C::s;
int main() {
C c;
C::s = 1;
}
Si consideri l'esempio riportato di seguito:
// LNK2019c.cpp
// LNK2019 expected
extern int i;
extern void g();
void f() {
i++;
g();
}
int main() {}
Se i e g non sono definiti in uno dei file inclusi nella generazione, verrà restituito l'errore LNK2019. È possibile aggiungere queste definizioni includendo il file del codice sorgente che le contiene come parte della compilazione. In alternativa, passare al linker i file obj o lib contenenti le definizioni.
Per i progetti C++ creati con le versioni precedenti e aggiornati con la versione corrente, se è stato definito __UNICODE e il punto di ingresso è WinMain, è necessario modificare il nome della funzione del punto di ingresso in _tWinMain o wWinMain.
Tra i problemi comuni che possono causare l'errore LNK2019, sono inclusi i seguenti:
La dichiarazione del simbolo contiene un errore di ortografia a causa del quale il nome risulta diverso dalla definizione del simbolo.
È stata utilizzata una funzione, ma il tipo o il numero dei parametri non corrisponde alla definizione della funzione.
La convenzione di chiamata (__cdecl, __stdcall o __fastcall) presenta differenze tra l'uso della dichiarazione e della definizione della funzione.
Le definizioni dei simboli si trovano in un file compilato come programma C e i simboli sono dichiarati in un file C++ senza modificatore "C" di tipo extern. In tal caso, modificare la dichiarazione. Ad esempio, anziché:
extern int i; extern void g();utilizzare:
extern "C" int i; extern "C" void g();Analogamente, se si definisce un simbolo in un file C++ che verrà utilizzato da un programma C, utilizzare extern "C" nella definizione.
Si fa riferimento all'esterno del file a un simbolo definito come static. In C++, diversamente da C, per le costanti globali viene effettuato un collegamento static. Per aggirare questa limitazione, è possibile includere le inizializzazioni const in un file di intestazione e questa intestazione nei file cpp oppure rendere la variabile non costante e utilizzare un riferimento costante per accedervi.
Un membro static di una classe non è definito. Ad esempio, nella dichiarazione della classe riportata di seguito è necessario definire separatamente la variabile membro si:
// LNK2019d.cpp #include <stdio.h> struct X { static int si; }; // int X::si = 0; // uncomment this line to resolve int main() { X *px = new X[2]; printf_s("\n%d",px[0].si); // LNK2019 }
Nell'esempio riportato di seguito viene generato l'errore LNK2019 in un operatore definito dall'utente.
// LNK2019e.cpp
// compile with: /EHsc
// LNK2019 expected
#include <iostream>
using namespace std;
template<class T> class
Test {
friend ostream& operator<<(ostream&, Test&);
// Uncomment the following line to resolve.
// template<typename T> friend ostream& operator << (ostream&, Test<T>&);
};
template<typename T>
ostream& operator<<(ostream& os, Test<T>& tt) {
return os;
}
int main() {
Test<int> t;
cout << "Test: " << t << endl; // unresolved external
}
L'opzione del linker /VERBOSE consente di individuare a quali file fa riferimento il linker. Le opzioni /EXPORTS e /SYMBOLS dell'utilità DUMPBIN consentono inoltre di individuare quali simboli sono definiti nella DLL e nei file oggetto e libreria.
Per ulteriori informazioni sull'errore LNK2019, vedere la Microsoft Knowledge Base all'indirizzo https://support.microsoft.com (informazioni in lingua inglese).
È inoltre possibile che l'errore LNK2019 venga generato come risultato delle operazioni di conformità eseguite per Visual Studio .NET 2003: specializzazione e friend di modelli. In Visual Studio .NET 2003 la dichiarazione di una funzione Friend che ha lo stesso nome di un modello di funzione non fa riferimento a quest'ultimo, a meno che gli argomenti di modello non siano specificati in modo esplicito nella dichiarazione friend.
Se gli argomenti di modelli non sono specificati, viene dichiarata una funzione Friend non modello.
Per ulteriori informazioni, vedere Riepilogo delle ultime modifiche in fase di compilazione.
Affinché il codice sia valido in entrambe le versioni Visual Studio .NET 2003 e Visual Studio .NET di Visual C++, specificare esplicitamente l'elenco di argomenti di template della funzione friend.
// LNK2019f.cpp
// LNK2019 expected
template<class T>
void f(T) {}
template<class T>
struct S {
friend void f(T);
// try the folowing line instead
// friend void f<T>(T);
};
int main() {
S<int> s;
f(1); // unresolved external
}
L'errore LNK2019 può inoltre verificarsi come risultato delle operazioni di conformità eseguite in Visual C++ 2005: /Zc:wchar_t è ora attivata per impostazione predefinita. È possibile che non tutti i moduli siano stati compilati con le stesse impostazioni /Zc:wchar_t e che pertanto i riferimenti di tipo non si risolvano in tipi compatibili. Per correggere l'errore, accertarsi che i tipi siano compatibili in tutti i moduli. A tale scopo, eseguire la compilazione con le impostazioni /Zc:wchar_t appropriate, ad esempio utilizzando /Zc:wchar_t- quando si generano moduli con strumenti di Visual C++ 2005 che verranno collegati ai moduli di versioni precedenti, oppure aggiornare i tipi in modo che risultino compatibili, se possibile.
I riferimenti espliciti a comsupp.lib, dal pragma di commento o dalla riga di comando, devono essere modificati in modo da utilizzare comsuppw.lib o comsuppwd.lib, poiché /Zc:wchar_t è ora attivata per impostazione predefinita. Quando si esegue la compilazione con /Zc:wchar_t-, è ancora necessario utilizzare comsupp.lib.
Per ulteriori informazioni, vedere Ultime modifiche al compilatore Visual C++ 2005 e /Zc:wchar_t (Tipo nativo wchar_t).
Nell'esempio riportato di seguito viene creata un'esportazione che utilizza WCHAR, che si risolve in wchar_t.
// LNK2019g.cpp
// compile with: /LD
#include "windows.h"
// WCHAR resolves to wchar_t
__declspec(dllexport) void func(WCHAR*) {}
Nell'esempio seguente viene generato l'errore LNK2019:
// LNK2019h.cpp
// compile with: LNK2019g.lib
// LNK2019 expected
__declspec(dllimport) void func(unsigned short*);
int main() {
func(0);
}
Per correggere questo errore, modificare unsigned short in wchar_t o WCHAR oppure compilare LNK2019g.cpp con /Zc:wchar_t-.
L'errore LNK2019 viene anche generato quando si crea un'applicazione console con /SUBSYSTEM:WINDOWS. Il simbolo con riferimenti non risolti sarà _WinMain@16. In questo caso, effettuare il collegamento con /SUBSYSTEM:CONSOLE.