Microsoft Visual C++ 6 Linker Fehler



  • Moin,
    ich habe folgendes Problem,
    ich hab gerade mit Visual C++ angefangen (vorher nur BlitzBasic) und habe jetzt
    ein kleines Programm geschrieben, dass ein Fenster erstellt und ein bisschen Text ausgibt.
    Hat auch alles schön funktioniert, aber wie gesagt, hat.
    Jetzt tut es das nicht mehr. Es kommt dann immer die Fehlermeldung:

    --------------------Konfiguration: main - Win32 Debug--------------------
    Linker-Vorgang läuft...
    LIBCD.lib(crt0.obj) : error LNK2001: Nichtaufgeloestes externes Symbol _main
    Debug/main.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
    Fehler beim Ausführen von link.exe.
    
    main.exe - 2 Fehler, 0 Warnung(en)
    

    Ich benutzte wie schon gesagt Visual C++ 6 in der Autorenedition aus dem Buch
    "Jetzt lerne ich Spieleprogrammierung mit DirectX und VisualC++" - von Christian Rouselle - ISBN 3-8272-5977-0
    Betriebssystem: Windows XP SP2

    Wenn es was hilft, kann ich auch noch den Quellcode posten.

    cg.Dark



  • Es fehlt die main Funktion. Schau mal ob Du eine irgendwo im Source hast.

    int main(int argc, char* argv[]) {
    }
    


  • Also eine Main Funktion habe ich, außerdem ist es doch ein Windows Programm, deshalb:

    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
     ...
    }
    


  • Dann hast du vermutlich den falschen Projekttyp ausgewählt, als du das Projekt angelegt hast - bei einer "Win32 Konsolenanwendung" brauchst du eine main(), bei einer "Win32 Anwendung" die WinMain().



  • Du hast ein KonsolenProjekt erstellt? Dort heißt der Einstiegspunkt main. Du willst vermutlich ein Win Programm erstellen (hier heißt der Einstiegspunkt WinMain). Du müsstest also ein "Win32 Applikation" Projekt erstellen.



  • k, da habe ich mich falsch ausgedrückt, es IST eine Win32 Projekt und es lief schonmal, hier jetzt doch der Quellcode:

    #include <windows.h>
    
    HWND CreateMainWindow(HINSTANCE hInstance);
    LRESULT CALLBACK MessageHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
    HWND hWnd = 0;
    
    const int gfxw = 420;
    const int gfxh = 335;
    
    char wndName[] = "Just a DARK Window";
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    
    	hWnd = CreateMainWindow(hInstance);
    
    	if(0 == hWnd) {
    		MessageBox(0, "WINDOW COULDN'T BE CREATED!", "ERROR!",MB_OK);
    		return 0;
    	}
    
    	MSG msg;
    
    	while(GetMessage(&msg, NULL, 0,0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    
    	return 0;
    }
    
    HWND CreateMainWindow(HINSTANCE hInstance)
    {
    
    	WNDCLASSEX wndClass;
    
    	wndClass.cbSize			= sizeof(WNDCLASSEX);
    	wndClass.style			= CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
    	wndClass.lpfnWndProc	= MessageHandler;
    	wndClass.cbClsExtra		= 0;
    	wndClass.cbWndExtra		= 0;
    	wndClass.hInstance		= hInstance;
    	wndClass.hbrBackground	= (HBRUSH) GetStockObject(WHITE_BRUSH);
    	wndClass.hCursor		= LoadCursor(NULL, IDC_ARROW);
    	wndClass.lpszMenuName	= NULL;
    	wndClass.lpszClassName	= "WindowClass";
    	wndClass.hIcon			= LoadIcon(NULL, IDI_WINLOGO);
    	wndClass.hIconSm		= LoadIcon(NULL, IDI_WINLOGO);
    
    	RegisterClassEx(&wndClass);
    
    	return CreateWindowEx(
    		NULL,
    		"WindowClass",
    		wndName,
    		WS_OVERLAPPEDWINDOW | WS_VISIBLE,
    		230,230,
    		gfxw,gfxh,
    		NULL,
    		NULL,
    		hInstance,
    		NULL
    	);
    }
    
    LRESULT CALLBACK MessageHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    
    	HDC hDC;
    
    	switch(msg) {
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		return 0;
    		break;
    
    	case WM_LBUTTONDOWN:
    		int x1,y1,x2,y2;
    		hDC = GetDC(hWnd);
    
    		x1 = LOWORD(lParam);
    		y1 = HIWORD(lParam);
    		x2 = x1 + 50;
    		y2 = y1 + 50;
    		Rectangle(hDC, x1,y1,x2,y2);
    
    		ReleaseDC(hWnd, hDC);
    		return 0;
    		break;
    
    	case WM_RBUTTONDOWN:
    		InvalidateRect(hWnd, 0, TRUE);
    		return 0;
    		break;
    
    	case WM_MOUSEMOVE:
    		int x,y;
    		char mouse_coord[25];
    
    		hDC = GetDC(hWnd);
    
    		x = LOWORD(lParam);
    		y = HIWORD(lParam);
    
    		sprintf(mouse_coord, "MOUSE COORD. : %-4d, %-4d", x,y);
    		SetTextColor(hDC, RGB(x%255,y%255,23));
    		TextOut(hDC, gfxw - strlen(mouse_coord)*8,23, mouse_coord, strlen(mouse_coord));
    
    		ReleaseDC(hWnd, hDC);
    		return 0;
    		break;
    
    	case WM_PAINT:
    		PAINTSTRUCT ps;
    		HDC hDC;
    
    		hDC = BeginPaint(hWnd, &ps);
    
    		HPEN PenBlack = CreatePen(PS_SOLID, 1, RGB(0,0,0));
    
    		char dark_string[] = "THIS RUUUUUL3Z!";
    		SelectObject(hDC, PenBlack);
    
    		unsigned int right_end_of_the_text_box = 150;
    
    		MoveToEx(hDC,20,20, NULL);
    		LineTo(hDC, right_end_of_the_text_box, 20);
    
    		for(short int i = 0; i < 255; i+= 17)
    		{
    			SetTextColor(hDC, RGB(i,i,i));
    			TextOut(hDC, 23,23 + i, dark_string,strlen(dark_string));
    		}
    
    		for(short int j = 0; j < 255; j++)
    		{
    			SetPixel(hDC, 20,20+j,RGB(j,j,j));
    			SetPixel(hDC, right_end_of_the_text_box, 20+j,RGB(j,j,j));
    		}
    
    		DeleteObject(PenBlack);
    		EndPaint(hWnd, &ps);
    
    		return 0;
    	}
    	return (DefWindowProc(hWnd, msg, wParam, lParam));
    }
    


  • Ja, aber Du hast dem Kompiler gesagt das dieser Source ein Konsolenprojekt darstellen soll. Deshalb sucht dieser nach main. Du mußt ihm sagen das es ein Windows Projekt ist. Dann sucht er nach WinMain... und findet es. Am besten Du machst ein neues Projekt und wählst Win32 Applikation aus. Den Source dann da einfügen.



  • Nee, sorry, aber ich hab dem schon gesagt dass es eine Win32 Anwendung sein soll (un KEINE Konsolenanwendung) - daran liegt's also nicht.



  • Hm, wie hast Du es ihm gesagt?

    EDIT: Benutzt Du Visual Studio 6 oder VS.Net?



  • Hey, ein bisschen mehr Fantasie bitte 😉

    P.S.: Falls die Frage, wieder aller Ahnungen ernst gemeint war:
    Datei->Neu->Projekt->Win32 Anwendung->*NAME EINGEBEN*->Leeres Projekt
    Datei->Neu->Datei->C++-Quellcodedatei->*NAME EINGEBEN* -> Fertig!

    P.P.S.: Vom gefühl her würde ich sagen Visual Studio 6, aber ich weis es nicht wirklich. (Wo krieg ich das raus?)



  • Einfach in der Menüleiste aufs Fragezeichen Klicken und dann "Über" auswählen.



  • Wenn ich es so mache wie Du beschrieben hast (es fehlt noch ein #include "stdio.h") dann erhalte ich ein Fenster mit dem Farbverlauftext und der Mausposition.

    Jetzt lasse ich mal meine Fantasie spielen: Du hast Win32 Console-Applikation bei der Projekt Erstellung ausgewählt?


Anmelden zum Antworten