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!