Linker Problem mit VC++ EE 2008 und OpenGl



  • Hallo,
    ich bin nicht sicher ob dieser Beitrag in dieses Forum gehört jedoch passt er hier hin vielleicht am ehesten.

    Also ich versuche gerade OpenGL in einem Fenster zu initialisieren (nach Nehe)und bekomme folgende zwei Fehler ausgegeben.

    1>Start.obj : error LNK2019: unresolved external symbol "public: int __thiscall OGLScene::InitGL(void)" (?InitGL@OGLScene@@QAEHXZ) referenced in function _WinMain@16
    
    1>Start.obj : error LNK2019: unresolved external symbol "public: void __thiscall OGLScene::ResizeGLScene(int,int)" (?ResizeGLScene@OGLScene@@QAEXHH@Z) referenced in function _WinMain@16
    

    In den Projekt Einstellungen verweise ich aber auf opengl32.lib sowie glu32.lib, dennoch scheint der Linker probleme damit zu haben.

    Kennt jemand die Lösung des Problems?



  • Wo kommen denn die OGLScene::InitGL und OGLScene::ResizeGLScene her? Selbstgemacht? Dann fehlt dir die Definition. Aus einer anderen Lib? Dann fehlt dir eben diese. Beide sind mir unter Windows noch nicht begegnet.

    Zeig mal den ganzen Code, dann kann man es besser abschätzen!



  • Hi,
    das ist meine OGLScene Klasse:

    #include <windows.h>
    #include <GL\gl.h>			// Header File For The OpenGL32 Library
    #include <GL\glu.h>			// Header File For The GLu32 Library
    
    class OGLScene{
    
    public:
    	OGLScene(){}
    	~OGLScene(){}
    
    	int InitGL(GLvoid){										// All Setup For OpenGL Goes Here
    		glShadeModel(GL_SMOOTH);							// Enable Smooth Shading
    		glClearColor(0.0f, 0.0f, 0.0f, 0.5f);				// Black Background
    		glClearDepth(1.0f);									// Depth Buffer Setup
    		glEnable(GL_DEPTH_TEST);							// Enables Depth Testing
    		glDepthFunc(GL_LEQUAL);								// The Type Of Depth Testing To Do
    		glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	// Really Nice Perspective Calculations
    		return TRUE;										// Initialization Went OK
    	}
    
    	GLvoid ResizeGLScene(GLsizei width, GLsizei height){		// Resize And Initialize The GL Window
    		if (height==0){										// Prevent A Divide By Zero By
    			height=1;										// Making Height Equal One
    		}
    
    		glViewport(0,0,width,height);						// Reset The Current Viewport
    
    		glMatrixMode(GL_PROJECTION);						// Select The Projection Matrix
    		glLoadIdentity();									// Reset The Projection Matrix
    
    		// Calculate The Aspect Ratio Of The Window
    		gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
    
    		glMatrixMode(GL_MODELVIEW);							// Select The Modelview Matrix
    		glLoadIdentity();									// Reset The Modelview Matrix
    	}
    
    };
    

    und das die Start Datei:

    #include <windows.h>
    #include "OGLScene.h"
    
    const char g_szClassName[] = "myWindowClass";
    
    OGLScene oglScene;
    
    // Step 4: the Window Procedure
    LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        switch(msg)
        {
            case WM_CLOSE:
                DestroyWindow(hwnd);
            break;
            case WM_DESTROY:
                PostQuitMessage(0);
            break;
            default:
                return DefWindowProc(hwnd, msg, wParam, lParam);
        }
        return 0;
    }
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
        LPSTR lpCmdLine, int nCmdShow)
    {
        WNDCLASSEX wc;
        HWND hwnd;
        MSG Msg;
    
        //Step 1: Registering the Window Class
        wc.cbSize        = sizeof(WNDCLASSEX);
        wc.style         = 0;
        wc.lpfnWndProc   = WndProc;
        wc.cbClsExtra    = 0;
        wc.cbWndExtra    = 0;
        wc.hInstance     = hInstance;
        wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
        wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
        wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
        wc.lpszMenuName  = NULL;
        wc.lpszClassName = g_szClassName;
        wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
    
        if(!RegisterClassEx(&wc))
        {
            MessageBox(NULL, "Window Registration Failed!", "Error!",
                MB_ICONEXCLAMATION | MB_OK);
            return 0;
        }
    
        // Step 2: Creating the Window
        hwnd = CreateWindowEx(
            WS_EX_CLIENTEDGE,
            g_szClassName,
            "Open GL Programming",
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
            NULL, NULL, hInstance, NULL);
    
        if(hwnd == NULL)
        {
            MessageBox(NULL, "Window Creation Failed!", "Error!",
                MB_ICONEXCLAMATION | MB_OK);
            return 0;
        }
    
        ShowWindow(hwnd, nCmdShow);
    	oglScene.ResizeGLScene(640,480);
    	oglScene.InitGL();
    
        UpdateWindow(hwnd);
    
        // Step 3: The Message Loop
        while(GetMessage(&Msg, NULL, 0, 0) > 0)
        {
            TranslateMessage(&Msg);
            DispatchMessage(&Msg);
        }
        return Msg.wParam;
    }
    

    Ich musste in der Opengl Klasse auch die windows.h includen, und weiss nicht wieso. Sonst würde die Datei nicht kompilieren



  • Den Windows.h-Inklude kannste schonmal aus der Main.cpp rausnehmen. Vielleicht hat er ja auch was gegen die Deklarierung in der Klasse, schau mal ob's so geht:

    #include <windows.h>
    #include <GL\gl.h>            
    #include <GL\glu.h>            
    
    class OGLScene
    {
    
    public:
        OGLScene(){}
        ~OGLScene(){}
    
        int InitGL(GLvoid);
    
        GLvoid ResizeGLScene(GLsizei width, GLsizei height);
    }; 
    
    int OGLScene::InitGL(GLvoid)
    {
            glShadeModel(GL_SMOOTH);                            
            glClearColor(0.0f, 0.0f, 0.0f, 0.5f);                
            glClearDepth(1.0f);                                   
            glEnable(GL_DEPTH_TEST);                            
            glDepthFunc(GL_LEQUAL);                                
            glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);   
            return TRUE;   
    };
    
    GLvoid OGLScene::ResizeGLScene(GLsizei width, GLsizei height)
    {
         if (height==0)
    	{                                        // Prevent A Divide By Zero By
                height=1;                                        // Making Height Equal One
            }
    
            glViewport(0,0,width,height);                        // Reset The Current Viewport
    
            glMatrixMode(GL_PROJECTION);                        // Select The Projection Matrix
            glLoadIdentity();                                    // Reset The Projection Matrix
    
            // Calculate The Aspect Ratio Of The Window
            gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
    
            glMatrixMode(GL_MODELVIEW);                            // Select The Modelview Matrix
            glLoadIdentity();      
     };
    

    Achja, was mir gerade auch aufgefallen ist, du inkludierst ja über "GL/...", ist das richtig? Prüf doch mal ob du das hier kompilieren kannst:
    http://nehe.gamedev.net/data/lessons/vc/lesson01.zip
    Falls ja, pack dir die Header in dein Program. Falls nicht, änder sie um und schau ob's so geht.



  • Hi,
    vielen Dank, jetzt funktioniert es! 😃


Log in to reply