2016-05-23 24 views
0

Folgender Fehler kommt, wenn ich das Projekt "proj1" Code kompiliere, der xyz.lib verwendet (es ist ein anderes Projekt, das erfolgreich kompiliert wurde).Verknüpfungsfehler in C++ auf Visual Studio 2013

Error 3 error LNK2019: unresolved external symbol "int __cdecl Vsnprintf16(unsigned short *,unsigned int,unsigned short const *,char *)" ([email protected]@[email protected]) referenced in function "int __cdecl eastl::Vsnprintf(wchar_t *,unsigned int,wchar_t const *,char *)" ([email protected]@@[email protected]) File : xyz.lib(abc.obj) 

abc.cpp hat Aufrufe an die Funktion sprintf.

Wenn ich den gesamten Code von abc.h und abc.cpp zu einigen anderen lets sagen def.h und def.cpp Datei, die bereits in xyz Projekt vorhanden ist dann funktioniert alles gut, keine Verknüpfung Fehler. Ich weiß nicht warum.

Ich habe alle Includes verwendet, die in Datei def.cpp in abc.cpp verwendet wurden, aber der gleiche Fehler.

Wenn ich die Sprintf() Aufrufe von abc.cpp entfernt, funktioniert auch alles gut.

Bitte, wenn jemand vorschlagen kann, warum dies geschieht. Danke

+1

Ist Ihr Projekt mit UNICODE aktiviert? – marcinj

+0

Ja, ich habe es versucht mit Unicode-Makro aktiviert und deaktiviert, der gleiche Fehler. In Projekteinstellungen Zeichensatz ist "Use Unicode-Zeichensatz" @ marcinj – lsrawat

+0

es sieht aus wie Sie sollten die Definition für diese Funktion selbst hinzufügen – marcinj

Antwort

1

Ich habe MSDN und auch VS2015 und VS2005 Quellcode-Ordner gesucht und keine Definition oder Erklärung von Vsnprintf16 gefunden.

Ich habe nicht verwendet eastl aber es sieht aus wie Sie selbst diese Funktion definieren sollten, können Sie Beispiele in den folgenden Links finden:

https://github.com/BSVino/Digitanks/blob/master/common/eastl.cpp

https://github.com/electronicarts/EASTL/blob/master/test/source/main.cpp

Referenz ich es sind hier:

// EASTL also wants us to define this (see string.h line 197) 
int Vsnprintf8(char* pDestination, size_t n, const char* pFormat, va_list arguments) 
{ 
    #ifdef _MSC_VER 
     return _vsnprintf(pDestination, n, pFormat, arguments); 
    #else 
     return vsnprintf(pDestination, n, pFormat, arguments); 
    #endif 
} 

int Vsnprintf16(char16_t* pDestination, size_t n, const char16_t* pFormat, va_list arguments) 
{ 
    #ifdef _MSC_VER 
     return _vsnwprintf((wchar_t*)pDestination, n, (wchar_t*)pFormat, arguments); 
    #else 
     char* d = new char[n+1]; 
     int r = vsnprintf(d, n, convertstring<char16_t, char>(pFormat).c_str(), arguments); 
     memcpy(pDestination, convertstring<char, char16_t>(d).c_str(), (n+1)*sizeof(char16_t)); 
     delete[] d; 
     return r; 
    #endif 
} 
+0

Aber sprintf wird in vielen Dateien nur für diese Datei nur verwendet wird, gibt es Linking-Fehler. Und wenn ich den Code dieser Datei in einen anderen verschiebe, funktioniert alles gut. Der Code erhält die Definition der Funktion, die Sie erwähnt haben, aber für die Datei abc.cpp findet die Kompilierung nicht richtig statt. Warum ? das ist die Frage. Ich habe den Code derzeit erstellt, indem ich den Code der Datei abc.cpp in eine andere Datei verschoben habe. @marcinj – lsrawat

+0

Sie haben also eine Definition von Vsnprintf16 in Ihrer Projektanwendung? Oder vielleicht ist es in dieser xyz.lib vorhanden? Überprüfen Sie, ob abc.cpp eine individuelle Konfiguration/Optionen hat, die sich von dieser def.cpp unterscheiden. Vielleicht einige spezielle Präprozessor-Definitionen. – marcinj

+0

Er erwähnt nicht, wie er das Eastl baut, aber es ist möglich, dass er nicht in 'eastl.cpp' verbindet ... Ich kenne das Eastl nicht gut genug. Aber gut gemacht, um diese Antwort zu bekommen; das ist ein Forschungsaufwand. – Niall