Linker Fehler LNK2001



  • Hallo,

    ich schon wieder :-/. Ich hab jetzt schon etliche Stunden gesucht woran es liegen kann, finde aber die Lösung nicht.

    Ich bekomme die Fehlermeldungen

    error LNK2001: Nicht aufgelöstes externes Symbol ""int __stdcall AfxMessageBox(char const *,unsigned int,unsigned int)" (?AfxMessageBox@@YGHPBDII@Z)".

    und

    error LNK2001: Nicht aufgelöstes externes Symbol ""wchar_t * __cdecl Piece(wchar_t const *,wchar_t *,int,char,int)" (?Piece@@YAPA_WPB_WPA_WHDH@Z)".

    Die bekomme ich in mehreren Klassen. Und kann somit auch nicht wirklich sagen an welcher Codestelle es hängen könnte. Aus dem Grund verzichte ich erst mal auf das Posten von Quellcode, liefere aber natürlich gerne nach wenn jemandem das weiterhelfen würde.



  • Was AfxMessageBox angeht...
    Mehrere Möglichkeiten.
    Wenn dein Programm aus mehreren Projekten besteht wurden vielleicht nicht alle auf Unicode umgestellt.
    Sonst würde ich vermuten dass es irgendwo - warum auch immer - eine eigene Deklaration von AfxMessageBox mit const char* ( LPCSTR ) gibt. Und diese Version von AfxMessageBox wird dann auch irgendwo aufgerufen.

    Was Piece angeht, das ist wohl ne Funktion aus deinem Programm.
    Da werden Deklaration und Definition nicht zusammenstimmen. Also Deklaration mit whcar_t und Definition mit char .



  • Die Definitionen die ich von beiden habe sind

    int AFXAPI AfxMessageBox(LPCSTR lpszText, UINT nType = MB_OK,
    				UINT nIDHelp = 0);
    int AFXAPI AfxMessageBox(UINT nIDPrompt, UINT nType = MB_OK,
    				UINT nIDHelp = (UINT)-1);
    int AFXAPI AfxMessageBox(LPCWSTR lpszText, UINT nType = MB_OK,
    	UINT nIDHelp = 0);
    

    Und

    extern LPTSTR Piece(LPCTSTR source, wchar_t* piece, int part, char trenn, int iPieceLength=4096);
    

    Ich ging jetzt davon aus das ich wchar_t oder auch char in die LP..STR geben kann.
    Die Umstellung des Projektes habe ich über das Projekteigenschaften Fenster gemacht, und da dann auf Unicode Zeichensatz umgestellt. Danach habe ich mich durch die Fehlerlisten gearbeitet. Natürlich will ich nicht abstreiten das mir dabei Fehler unterlaufen sind.
    Der Code Kompliert jetzt zwar aber wenn der Linker noch jault muss ja noch was im Argen sein. Hab ich da irgendwie eine Chance aus den Linker Fehlermeldungen rauszusuchen wo das Problem liegt, oder muss ich jeden einzelnen Aufruf der Funktionen per Hand durch gehen?



  • Ich hab jetzt noch mal geguckt was die Funktion Piece angeht. Dort wird im Code eigentlich bis auf wenige Ausnahmen immer nur ein CString übergeben.
    Liegt da vielleicht eins meiner Problem.



  • Korrekt wäre

    int AFXAPI AfxMessageBox(
       LPCTSTR lpszText,
       UINT nType = MB_OK,
       UINT nIDHelp = 0 
    );
    

    Also schmeiss die LPCSTR und LPCWSTR Versionen weg und verwende statt dessen nur eine Deklaration mit LPCTSTR . Wieso enthält dein Programm überhaupt eigene Deklarationen für AfxMessageBox ?

    Und was Piece angeht: Mit was das aufgerufen wird ist erstmal egal. Wie sieht die Implementierung aus?



  • Wo kommt Piece her? Müsste es vielleicht extern "C" deklariert sein?



  • Das wäre dann einmal die Funktion Piece. Das mit der Afx Fehler ist schon mal weg 🙂

    LPSTR Piece(LPCTSTR source, char* piece, int part, char trenn, int iPieceLength) {
    	// Tracking
    	if (theApp.m_ia.bProtocolAll)	
    		Tracking(_T("$Piece(\"%s\",\"%c\",%d)"), PIECE, source, trenn, part);
    
    	int iMaxSource = _tcslen(source);
    
    	//Tracking
    	if ((theApp.m_ia.bProtocol)&&(iMaxSource>iPieceLength))	
    		Tracking(_T("$Piece-Fehler Größe source %d - Größe Array %d - Piece-Teil %d"), PIECE, iMaxSource, iPieceLength, part);
    
    	int so=0, de=0;
    
    	while (part>0) {
    
    		if (source[so]==trenn||source[so]==0)
    		{
    
    			part--;
    
    			if (part==0) 
    			{
    
    				piece[de]=0;
    
    				return piece;
    			} 
    
    			else if (source[so]==0) 
    			{
    				*piece=0;
    				return piece;
    			} 
    
    			else
    				de=0;
    		} 
    
    		else 
    		{
    
    			piece[de]=source[so];
    			de++;
    		}
    
    		so++;
    
    	}
    	return piece;                  
    }
    


  • Und was ist jetzt so schwer daran, die Datentypen der Parameter zu vergleichen?



  • Manchmal da gibt es sie, die Tage wo man um sich herum nur Bäume sieht und dennoch den Wald sucht :p



  • Beim Prototyp:

    `extern LPTSTR Piece(LPCTSTR source, LPTSTR piece, int part, TCHAR trenn, int iPieceLength=4096);

    `

    Implementierung:

    `LPTSTR Piece(LPCTSTR source, LPTSTR piece, int part, TCHAR trenn, int iPieceLength)

    {

    ...

    `


Anmelden zum Antworten