Gateway_man Geschrieben 19. Oktober 2011 Teilen Geschrieben 19. Oktober 2011 (bearbeitet) Hi leute, ich habe bei einer Funktion ständig mehrmals den LNK2019 Fehler. "Verweis auf nicht aufgelöstes externes Symbol". Die enstprechende Funktion sieht wie folgt aus: double FingerPrintMatchResult (BITMAPINFOHEADER header1, BITMAPINFOHEADER header2){ double match = 0; DrmErrorCode_t nRetCode; FC3Template_t hTemplate1, hTemplate2; FC3Encode_t hEncoder; FC3Match_t hMatcher; double dScore; BITMAPINFOHEADER* pBitmap1 = &header1; BITMAPINFOHEADER* pBitmap2 = &header2; if (pBitmap1==NULL) { return 0; } if (pBitmap2==NULL) { return 0; } long nBitmapSize1 = ((pBitmap1->biWidth+3)&~3)*pBitmap1->biHeight+1024+sizeof(BITMAPINFOHEADER); long nBitmapSize2 = ((pBitmap2->biWidth+3)&~3)*pBitmap2->biHeight+1024+sizeof(BITMAPINFOHEADER); nRetCode = FC3Initialize(NULL); if (nRetCode!=FPC_SUCCESS) { char* error = FC3GetErrorDescriptionA(nRetCode); free(pBitmap1); free(pBitmap2); return 0; } nRetCode = FC3CreateTemplate(&hTemplate1); if (nRetCode!=FPC_SUCCESS) { char* error = FC3GetErrorDescriptionA(nRetCode); FC3Uninitialize(); free(pBitmap1); free(pBitmap2); delete error; return 0; } nRetCode = FC3CreateTemplate(&hTemplate2); if (nRetCode!=FPC_SUCCESS) { char* error = FC3GetErrorDescriptionA(nRetCode); FC3DestroyHandle((FC3_t *)&hTemplate1); FC3Uninitialize(); free(pBitmap1); free(pBitmap2); delete error; return 0; } nRetCode = FC3CreateEncoder(&hEncoder); if (nRetCode!=FPC_SUCCESS) { char* error = FC3GetErrorDescriptionA(nRetCode); FC3DestroyHandle((FC3_t *)&hTemplate1); FC3DestroyHandle((FC3_t *)&hTemplate2); FC3Uninitialize(); free(pBitmap1); free(pBitmap2); delete error; return 0; } nRetCode=FC3SetPropertyA(hEncoder, FC3_PR_ENCODE_FORMAT, "ISO/IEC 19794-2:2005" ); if (nRetCode!=FPC_SUCCESS) char* error = FC3GetErrorDescriptionA(nRetCode); nRetCode = FC3Encode(hEncoder, pBitmap1, nBitmapSize1, hTemplate1); if (nRetCode!=FPC_SUCCESS) { char* error = FC3GetErrorDescriptionA(nRetCode); FC3DestroyHandle((FC3_t *)&hTemplate1); FC3DestroyHandle((FC3_t *)&hTemplate2); FC3DestroyHandle((FC3_t *)&hEncoder); FC3Uninitialize(); free(pBitmap1); free(pBitmap2); delete error; return 0; } double quality; nRetCode = FC3GetPropertyDoubleA(hTemplate1, FC3_PR_TEMPLATE_QUALITY, &quality); if (nRetCode!=FPC_SUCCESS) { char* error = FC3GetErrorDescriptionA(nRetCode); FC3Uninitialize(); free(pBitmap1); free(pBitmap2); delete error; return 0; } //if (quality != 0){ //quality1 = quality; //} nRetCode = FC3Encode(hEncoder, pBitmap2, nBitmapSize2, hTemplate2); if (nRetCode!=FPC_SUCCESS) { char* error = FC3GetErrorDescriptionA(nRetCode); FC3DestroyHandle((FC3_t *)&hTemplate1); FC3DestroyHandle((FC3_t *)&hTemplate2); FC3DestroyHandle((FC3_t *)&hEncoder); FC3Uninitialize(); free(pBitmap1); free(pBitmap2); delete error; return 0; } nRetCode = FC3GetPropertyDoubleA(hTemplate2, FC3_PR_TEMPLATE_QUALITY, &quality); if (nRetCode!=FPC_SUCCESS) { char* error = FC3GetErrorDescriptionA(nRetCode); FC3Uninitialize(); free(pBitmap1); free(pBitmap2); delete error; return 0; } //if (quality!=0){ //quality2 = quality; //} size_t nTemplateSize=0; nRetCode = FC3GetTemplateData(hTemplate1, NULL, &nTemplateSize); //if (nRetCode!=FPC_SUCCESS && nRetCode!=FPC_ERROR_TEMPLATE_SIZE) //printf("Error (%d) while getting first template data: %s\n", (int)nRetCode, FC3GetErrorDescriptionA(nRetCode)); BYTE *TemplateData = new BYTE[nTemplateSize]; memset(TemplateData, 0, sizeof(BYTE) * nTemplateSize); nRetCode = FC3GetTemplateData(hTemplate1, (BYTE *)TemplateData, (size_t*)&nTemplateSize); //if (nRetCode!=FPC_SUCCESS) // printf("Error (%d) while getting first template data: %s\n", (int)nRetCode, FC3GetErrorDescriptionA(nRetCode)); if (nRetCode == FPC_SUCCESS) { FILE *out = NULL; out=fopen("EkaTemplate.template", "wb"); fwrite(TemplateData, nTemplateSize, 1, out); fclose(out); } delete [] TemplateData; nTemplateSize=0; nRetCode = FC3GetTemplateData(hTemplate2, NULL, &nTemplateSize); //if (nRetCode!=FPC_SUCCESS && nRetCode!=FPC_ERROR_TEMPLATE_SIZE) // printf("Error (%d) while getting second template data: %s\n", (int)nRetCode, FC3GetErrorDescriptionA(nRetCode)); TemplateData = new BYTE[nTemplateSize]; memset(TemplateData, 0, sizeof(BYTE) * nTemplateSize); nRetCode = FC3GetTemplateData(hTemplate2, (BYTE *)TemplateData, (size_t*)&nTemplateSize); //if (nRetCode!=FPC_SUCCESS) // printf("Error (%d) while getting second template data: %s\n", (int)nRetCode, FC3GetErrorDescriptionA(nRetCode)); if (nRetCode == FPC_SUCCESS) { FILE *out = NULL; out=fopen("TokaTemplate.template", "wb"); fwrite(TemplateData, nTemplateSize, 1, out); fclose(out); } delete [] TemplateData; nRetCode = FC3CreateMatcher(&hMatcher); if (nRetCode!=FPC_SUCCESS) { //printf("Error (%d) while creating matcher: %s\n", (int)nRetCode, FC3GetErrorDescriptionA(nRetCode)); FC3DestroyHandle((FC3_t *)&hTemplate1); FC3DestroyHandle((FC3_t *)&hTemplate2); FC3DestroyHandle((FC3_t *)&hEncoder); FC3Uninitialize(); free(pBitmap1); free(pBitmap2); return 0; } nRetCode = FC3Match(hMatcher, hTemplate1, hTemplate2, &dScore); if (nRetCode!=FPC_SUCCESS) { //printf("Error (%d) while matching templates: %s\n", (int)nRetCode, FC3GetErrorDescriptionA(nRetCode)); FC3DestroyHandle((FC3_t *)&hTemplate1); FC3DestroyHandle((FC3_t *)&hTemplate2); FC3DestroyHandle((FC3_t *)&hEncoder); FC3DestroyHandle((FC3_t *)&hMatcher); FC3Uninitialize(); free(pBitmap1); free(pBitmap2); return 0; } if (dScore!=0) match = dScore; FC3DestroyHandle((FC3_t *)&hTemplate1); FC3DestroyHandle((FC3_t *)&hTemplate2); FC3DestroyHandle((FC3_t *)&hEncoder); FC3DestroyHandle((FC3_t *)&hMatcher); free(pBitmap1); free(pBitmap2); nRetCode = FC3Uninitialize(); return match; } Und die Fehler die geworfen werden sind die folgenden: Fehler 4 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_FC3Match@16" in Funktion ""double __cdecl FingerPrintMatchResult(struct tagBITMAPINFOHEADER,struct tagBITMAPINFOHEADER)" (?FingerPrintMatchResult@@YANUtagBITMAPINFOHEADER@@0@Z)". C:\_p10\DermalogInterface\DermalogInterface\DermalogInterface.obj DermalogInterface Fehler 5 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_FC3CreateMatcher@4" in Funktion ""double __cdecl FingerPrintMatchResult(struct tagBITMAPINFOHEADER,struct tagBITMAPINFOHEADER)" (?FingerPrintMatchResult@@YANUtagBITMAPINFOHEADER@@0@Z)". C:\_p10\DermalogInterface\DermalogInterface\DermalogInterface.obj DermalogInterface Fehler 6 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_FC3GetTemplateData@12" in Funktion ""double __cdecl FingerPrintMatchResult(struct tagBITMAPINFOHEADER,struct tagBITMAPINFOHEADER)" (?FingerPrintMatchResult@@YANUtagBITMAPINFOHEADER@@0@Z)". C:\_p10\DermalogInterface\DermalogInterface\DermalogInterface.obj DermalogInterface Fehler 7 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_FC3GetPropertyDoubleA@12" in Funktion ""double __cdecl FingerPrintMatchResult(struct tagBITMAPINFOHEADER,struct tagBITMAPINFOHEADER)" (?FingerPrintMatchResult@@YANUtagBITMAPINFOHEADER@@0@Z)". C:\_p10\DermalogInterface\DermalogInterface\DermalogInterface.obj DermalogInterface Fehler 8 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_FC3Encode@16" in Funktion ""double __cdecl FingerPrintMatchResult(struct tagBITMAPINFOHEADER,struct tagBITMAPINFOHEADER)" (?FingerPrintMatchResult@@YANUtagBITMAPINFOHEADER@@0@Z)". C:\_p10\DermalogInterface\DermalogInterface\DermalogInterface.obj DermalogInterface Fehler 9 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_FC3SetPropertyA@12" in Funktion ""double __cdecl FingerPrintMatchResult(struct tagBITMAPINFOHEADER,struct tagBITMAPINFOHEADER)" (?FingerPrintMatchResult@@YANUtagBITMAPINFOHEADER@@0@Z)". C:\_p10\DermalogInterface\DermalogInterface\DermalogInterface.obj DermalogInterface Fehler 10 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_FC3CreateEncoder@4" in Funktion ""double __cdecl FingerPrintMatchResult(struct tagBITMAPINFOHEADER,struct tagBITMAPINFOHEADER)" (?FingerPrintMatchResult@@YANUtagBITMAPINFOHEADER@@0@Z)". C:\_p10\DermalogInterface\DermalogInterface\DermalogInterface.obj DermalogInterface Fehler 11 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_FC3DestroyHandle@4" in Funktion ""double __cdecl FingerPrintMatchResult(struct tagBITMAPINFOHEADER,struct tagBITMAPINFOHEADER)" (?FingerPrintMatchResult@@YANUtagBITMAPINFOHEADER@@0@Z)". C:\_p10\DermalogInterface\DermalogInterface\DermalogInterface.obj DermalogInterface Fehler 12 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_FC3Uninitialize@0" in Funktion ""double __cdecl FingerPrintMatchResult(struct tagBITMAPINFOHEADER,struct tagBITMAPINFOHEADER)" (?FingerPrintMatchResult@@YANUtagBITMAPINFOHEADER@@0@Z)". C:\_p10\DermalogInterface\DermalogInterface\DermalogInterface.obj DermalogInterface Fehler 13 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_FC3CreateTemplate@4" in Funktion ""double __cdecl FingerPrintMatchResult(struct tagBITMAPINFOHEADER,struct tagBITMAPINFOHEADER)" (?FingerPrintMatchResult@@YANUtagBITMAPINFOHEADER@@0@Z)". C:\_p10\DermalogInterface\DermalogInterface\DermalogInterface.obj DermalogInterface Fehler 14 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_FC3GetErrorDescriptionA@4" in Funktion ""double __cdecl FingerPrintMatchResult(struct tagBITMAPINFOHEADER,struct tagBITMAPINFOHEADER)" (?FingerPrintMatchResult@@YANUtagBITMAPINFOHEADER@@0@Z)". C:\_p10\DermalogInterface\DermalogInterface\DermalogInterface.obj DermalogInterface Fehler 15 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_FC3Initialize@4" in Funktion ""double __cdecl FingerPrintMatchResult(struct tagBITMAPINFOHEADER,struct tagBITMAPINFOHEADER)" (?FingerPrintMatchResult@@YANUtagBITMAPINFOHEADER@@0@Z)". C:\_p10\DermalogInterface\DermalogInterface\DermalogInterface.obj DermalogInterface Fehler 16 error LNK1120: 12 nicht aufgelöste externe Verweise. C:\_p10\DermalogInterface\Debug\DermalogInterface.dll DermalogInterface Entweder hab ich Tomaten auf den Augen oder ich bin einfach nur zu dämlich um es zu checken.... Die entsprechende Fehlerdefinitionsseite auf der MSDN hat leider zu keinem Erfolgserlebnis geführt. Eventuell seht ihr mehr als ich. lg Gateway Bearbeitet 19. Oktober 2011 von Gateway_man Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 19. Oktober 2011 Teilen Geschrieben 19. Oktober 2011 (bearbeitet) Du hast vermutlich einfach die Bibliothek, in der diese FC3...-Funktionen definiert sind, nicht dazugelinkt. Bearbeitet 19. Oktober 2011 von Klotzkopp Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gateway_man Geschrieben 19. Oktober 2011 Autor Teilen Geschrieben 19. Oktober 2011 Wiedermal bist du der Retter in der Not . Hab ich doch tatsächlich vergessen den Verweis zu setzen :upps. Danke dir. lg Gateway Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gateway_man Geschrieben 23. Oktober 2011 Autor Teilen Geschrieben 23. Oktober 2011 Hi, nochmal mein wenigkeit. Ich bin gerade dabei meinen .NET Ini Parser in Cpp zu portieren. Jetzt bekomm ich vom Linker wieder einen Fehler das scheinbar wieder etwas vergessen wurde. Ich versteh nicht ganz was da fehlen soll, da eigentlich alles in dem dll Projekt definiert wurde was genutzt wird. Auch die entsprechenden header (string, vector etc.) wurden eingebunden. Es geht um folgende Funktion: void Ini::WriteToFile(){ if (this->filename.length() > 0){ ofstream inifile; inifile.open(filename,ios::out); for (vector<Section>::size_type i=0; i< sections.size();i++){ vector<KVP> kvp = sections[i].GetEntries(); inifile << "[" << sections[i].GetName() << "]" << "\n"; for (vector<KVP>::size_type i2=0;i2< kvp.size();i2++){ [B]//Sobald ich die nachfolgende zeile wieder einebziehe schmeißt er den Fehler.[/B] //string kvpline = kvp[i2].GetKey() + "=" + kvp[i2].GetValue(); //inifile << kvpline << "\n"; } } inifile.flush(); inifile.close(); } } KVP ist ist weiter oben definiert: typedef KeyValuePair<string,string> KVP; Fehler: Verweis auf nicht aufgelöstes externes Symbol ""public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall KeyValuePair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >::GetKey(void)" (?GetKey@?$KeyValuePair@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V12@@@QAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)" in Funktion ""public: void __thiscall Ini::WriteToFile(void)" (?WriteToFile@Ini@@QAEXXZ)". Wenn Ihr mehr Infos braucht dann werd ich gerne auch die restlichen header files reinstellen. Warscheinlich ist es eh wieder ne kleinigkeit die ich übersehn habe :upps. lg Gateway Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 23. Oktober 2011 Teilen Geschrieben 23. Oktober 2011 Offenbar ist die Methode KeyValuePair::GetKey nicht definiert. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gateway_man Geschrieben 23. Oktober 2011 Autor Teilen Geschrieben 23. Oktober 2011 Eigentlich dachte ich schon das ich die definiert habe. Es sei angemerkt das ich heute das erste mal mit templates in cpp gearbeitet habe. Sonst immer mit verketten listen... Eventuell habe ich einen Fehler bei der Implementierung gemacht. Hier ist das Headerfile von KeyValuePair: #include "stdafx.h" #include "targetver.h" template <class K, class V> class KeyValuePair{ public: KeyValuePair(K key, V value); K GetKey(); V GetValue(); void SetKey(K key); void SetValue(V value); private: K key; V value; }; Hier ist das dazugehörige cpp file: #include "stdafx.h" #include "KeyValuePair.h" template <class K, class V> KeyValuePair<K,V>::KeyValuePair(K key, V value){ this->key = key; this->value = value; } template <class K, class V> K KeyValuePair<K,V>::GetKey(){ return this->key; } template <class K, class V> V KeyValuePair<K,V>::GetValue(){ return this->value; } template <class K, class V> void KeyValuePair<K,V>::SetKey(K key){ this->key = key; } template <class K, class V> void KeyValuePair<K,V>::SetValue(V value){ this->value = value; } lg Gateway Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 23. Oktober 2011 Teilen Geschrieben 23. Oktober 2011 Ein Template wird nur da erzeugt, wo es benutzt wird. Und erzeugt werden kann es nur, wenn die Definition bekannt ist. Dort, wo die Definition liegt, also in KeyValuePair.cpp, wird KeyValuePair<string, string> offenbar nicht verwendet. Und da, wo es verwendet wird, liegt die Definition nicht vor. Wenn du vorher genau weißt, welche Konkretisierungen des Templates du brauchst, kannst du diese in KeyValuePair.cpp explizit erzeugen. Wenn nicht, darfst du die Klasse nicht in Header und Cpp-Datei aufteilen, sondern musst alles in die Headerdatei stecken. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gateway_man Geschrieben 23. Oktober 2011 Autor Teilen Geschrieben 23. Oktober 2011 Super vielen Dank. Wieder was gelernt . Ich dachte ich mache es so, wie ich es mit den Klassen halte, also um die Verständlichkeit zu erhöhen. lg Gateway Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.