error LNK2019: Verweis auf nicht aufgelöstes externes Symbol
-
Hey Leute,
habe blöderweise Probleme mit meinem Linker in Visual Studio C++ 2010.
Bekomme folgende Fehlermeldungen:
1>main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: struct HDC__ * __thiscall OpenGLInit::get_hDC(void)" (?get_hDC@OpenGLInit@@QAEPAUHDC__@@XZ)" in Funktion "_WinMain@16".
1>main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: struct tagRECT __thiscall OpenGLInit::get_rect(void)" (?get_rect@OpenGLInit@@QAE?AUtagRECT@@XZ)" in Funktion "_WinMain@16".
1>main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: int __thiscall OpenGLInit::get_iHoehe(void)" (?get_iHoehe@OpenGLInit@@QAEHXZ)" in Funktion "_WinMain@16".
1>main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: int __thiscall OpenGLInit::get_iBreite(void)" (?get_iBreite@OpenGLInit@@QAEHXZ)" in Funktion "_WinMain@16".Im Anhang poste ich die wichtigen Teile des Quelltextes. (Vieles zugeklappt...)
OpenGLInit.cpp
[code]//<-------------OpenGLInit_CPP------------->// #include "StdAfx.h" #include "OpenGLInit.h" //<---Funtkionen--->// //Constructor OpenGLInit::OpenGLInit(){ fRotateY = 0.0f; fTransX = 0.0f; fTransY = 0.0f; fTransZ = 0.0f; fPi180 = 0.0174532925f; for(int i = 0; i<256; i++){ bKeys[i] = false; } } //Variablen Funktionen inline HDC OpenGLInit::get_hDC(){ return this->hDC; } inline RECT OpenGLInit::get_rect(){ return this-> rect; } inline int OpenGLInit::get_iHoehe(){ //return this->iBreite; return 480; } inline int OpenGLInit::get_iBreite(){ //return this->iBreite; return 640; } void OpenGLInit::set_rect(int iWidth, int iHeight, bool bFullscreen){ if(bFullscreen){ HWND hWndDesktop = GetDesktopWindow(); GetWindowRect(hWndDesktop, &rect); dwStyle = WS_POPUP; } else{ rect.top = 0; rect.bottom = 0; rect.right = iWidth; rect.left = iHeight; dwStyle = WS_OVERLAPPEDWINDOW; } } //Generelle Funktionen LRESULT CALLBACK OpenGLInit::WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){ switch(msg){ case WM_DESTROY: PostQuitMessage(0); break; case WM_QUIT: MessageBox(NULL, "Programm wird beendet", "Programm Ende", MB_ICONINFORMATION | MB_OK); break; case WM_SIZE: opengl_resize_scene(LOWORD(lParam), HIWORD(lParam)); break; default: return DefWindowProc(hWnd, msg, wParam, lParam); break; } return 0; } LRESULT CALLBACK OpenGLInit::StaticWndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){ OpenGLInit* pOGlInit; if(msg == WM_CREATE){ pOGlInit = (OpenGLInit*) (((LPCREATESTRUCT) lParam)->lpCreateParams); SetWindowLongPtr(hWnd, GWL_USERDATA, (LONG_PTR) pOGlInit); } else{ pOGlInit = (OpenGLInit*)GetWindowLongPtr(hWnd, GWL_USERDATA); } return pOGlInit->WndProc(hWnd, msg, wParam, lParam); } bool OpenGLInit::screen_setup(HINSTANCE hInst, int iCmdShow, int iHoehe, int iBreite){ strcpy_s(szClassName, "MyWndClass"); strcpy_s(szWindowTitle, "OpenGl"); this->iHoehe = iHoehe; this->iBreite = iBreite; //Registrieren this->WndClassEx.cbSize = sizeof(WndClassEx); this->WndClassEx.cbClsExtra = NULL; this->WndClassEx.cbWndExtra = NULL; this->WndClassEx.hInstance = hInst; this->WndClassEx.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH); this->WndClassEx.hIcon = LoadIcon(NULL, IDI_APPLICATION); this->WndClassEx.hCursor = LoadCursor(NULL, IDC_ARROW); this->WndClassEx.hIconSm = NULL; this->WndClassEx.lpfnWndProc = StaticWndProc; this->WndClassEx.style = CS_OWNDC; this->WndClassEx.lpszMenuName = NULL; this->WndClassEx.lpszClassName = szClassName; if(!RegisterClassEx(&WndClassEx)){ MessageBox(NULL, "Fehler beim Registrieren des Fensters", "Error!", MB_ICONERROR | MB_OK); return false; } hWnd = CreateWindow(szClassName, szWindowTitle, dwStyle | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, this->iBreite, this->iHoehe, NULL, NULL, hInst, NULL); if(!hWnd){ MessageBox(NULL, "Fehler beim Erstellen des Fensters!", "Error!", MB_ICONERROR | MB_OK); return false; } ShowWindow(hWnd, iCmdShow); UpdateWindow(hWnd); return true; } void OpenGLInit::opengl_setup(){ //Rest memset(&pfd, 0, sizeof(pfd)); pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 32; pfd.cDepthBits = 32; pfd.cAlphaBits = 8; //Fullscreen memset(&dmSettings, 0, sizeof(dmSettings)); dmSettings.dmSize = sizeof(dmSettings); dmSettings.dmPelsHeight = rect.bottom; dmSettings.dmPelsWidth = rect.right; dmSettings.dmBitsPerPel = 32; dmSettings.dmFields = DM_PELSHEIGHT | DM_PELSWIDTH | DM_BITSPERPEL; ChangeDisplaySettings(&dmSettings, CDS_FULLSCREEN); //Rest hDC = GetDC(hWnd); iFormat = ChoosePixelFormat(hDC, &pfd); SetPixelFormat(hDC, iFormat, &pfd); hGLRC = wglCreateContext(hDC); wglMakeCurrent(hDC, hGLRC); glLoadIdentity(); } unsigned char OpenGLInit::key_pressed(){ if(PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE)){ if(msg.message == WM_QUIT){ return 1; } else if(msg.message == WM_KEYDOWN){ bKeys[msg.wParam] = true; if(msg.wParam == VK_ESCAPE){ MessageBox(NULL, "Error", "Menu noch nicht implementiert", MB_OK | MB_ICONERROR); } } else if(msg.message == WM_KEYUP){ bKeys[msg.wParam] = false; } TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } void OpenGLInit::HandleKeyboard(){ if(bKeys[VK_UP]){ fTransZ -= cos(fRotateY * fPi180); fTransX -= sin(fRotateY * fPi180); } else if(bKeys[VK_DOWN]){ fTransZ += cos(fRotateY * fPi180); fTransX += sin(fRotateY * fPi180); } } void OpenGLInit::HandleMouse(){ } //OpenGl void OpenGLInit::opengl_reset_scene(){ if(this->iBreite == 0 || this->iHoehe == 0){ this->iBreite = 1; this->iHoehe = 1; } glViewport(0, 0, this->iBreite, this->iHoehe); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective( 45.0f, this->iBreite/this->iHoehe, 1.0f, 100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glEnable(GL_DEPTH_TEST); glClearColor(0.0f, 0.3f, 0.8, 1.0f); } void OpenGLInit::opengl_resize_scene( int iBreite, int iHoehe){ if(iBreite == 0 || iHoehe == 0){ iBreite = 1; iHoehe = 1; } glViewport(0, 0, iBreite, iHoehe); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective( 45.0f, iBreite/iHoehe, 1.0f, 100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void OpenGLInit::opengl_draw_house(float fX, float fZ, float fY, float fR, float fG, float fB){ glColor3f(0.5f, 0.5f, 0.0f); glBegin(GL_QUADS); //<---Haus-Grundgerüst--->// //Front glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(fX-1.0f, fZ+1.0f, fZ+1.0f); glVertex3f(fX-1.0f, fZ-1.0f, fZ+1.0f); glVertex3f(fX+1.0f, fZ-1.0f, fZ+1.0f); glVertex3f(fX+1.0f, fZ+1.0f, fZ+1.0f); //Right glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(fX+1.0f, fZ+1.0f, fZ+1.0f); glVertex3f(fX+1.0f, fZ-1.0f, fZ+1.0f); glVertex3f(fX+1.0f, fZ-1.0f, fZ-1.0f); glVertex3f(fX+1.0f, fZ+1.0f, fZ-1.0f); //Back glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(fX+1.0f, fZ+1.0f, fZ-1.0f); glVertex3f(fX+1.0f, fZ-1.0f, fZ-1.0f); glVertex3f(fX-1.0f, fZ-1.0f, fZ-1.0f); glVertex3f(fX-1.0f, fZ+1.0f, fZ-1.0f); //Left glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(fX-1.0f, fZ+1.0f, fZ+1.0f); glVertex3f(fX-1.0f, fZ+1.0f, fZ-1.0f); glVertex3f(fX-1.0f, fZ-1.0f, fZ-1.0f); glVertex3f(fX-1.0f, fZ-1.0f, fZ+1.0f); //Top glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(fX-1.0f, fZ+1.0f, fZ+1.0f); glVertex3f(fX+1.0f, fZ+1.0f, fZ+1.0f); glVertex3f(fX+1.0f, fZ+1.0f, fZ-1.0f); glVertex3f(fX-1.0f, fZ+1.0f, fZ-1.0f); //Bottom glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(fX-1.0f, fZ-1.0f, fZ+1.0f); glVertex3f(fX+1.0f, fZ-1.0f, fZ+1.0f); glVertex3f(fX+1.0f, fZ-1.0f, fZ-1.0f); glVertex3f(fX-1.0f, fZ-1.0f, fZ-1.0f); //<---Dach--->// //Teil 1 glColor3f(0.7f, 0.0f, 0.3f); glVertex3f(fX+0.0f, fZ+4.0f, fZ+0.0f); glVertex3f(fX-1.0f, fZ+1.0f, fZ+0.0f); glVertex3f(fX-1.0f, fZ+1.0f, fZ+1.0f); glVertex3f(fX+0.0f, fZ+1.0f, fZ+0.0f); //Teil 2 glColor3f(0.7f, 0.0f, 0.3f); glVertex3f(fX+0.0f, fZ+4.0f, fZ+0.0f); glVertex3f(fX+1.0f, fZ+1.0f, fZ+0.0f); glVertex3f(fX+1.0f, fZ+1.0f, fZ-1.0f); glVertex3f(fX+0.0f, fZ+1.0f, fZ+0.0f); //Teil 3 glColor3f(0.7f, 0.0f, 0.3f); glVertex3f(fX+0.0f, fZ+4.0f, fZ+0.0f); glVertex3f(fX-1.0f, fZ+1.0f, fZ+0.0f); glVertex3f(fX-1.0f, fZ+1.0f, fZ+1.0f); glVertex3f(fX+0.0f, fZ-1.0f, fZ+0.0f); //Teil 4 glColor3f(0.7f, 0.0f, 0.3f); glVertex3f(fX+0.0f, fZ+4.0f, fZ+0.0f); glVertex3f(fX+1.0f, fZ+1.0f, fZ+0.0f); glVertex3f(fX+1.0f, fZ+1.0f, fZ+-1.0f); glVertex3f(fX+0.0f, fZ-1.0f, fZ+0.0f); glEnd(); } void OpenGLInit::opengl_draw_tower(float fX, float fZ, float fY, float fR, float fG, float fB){ glBegin(GL_QUADS); //<---Tower-Grundgerüst--->// //Front glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(fX-1.0f, fZ+20.0f, fZ+1.0f); glVertex3f(fX-1.0f, fZ+19.0f, fZ+1.0f); glVertex3f(fX+1.0f, fZ+19.0f, fZ+1.0f); glVertex3f(fX+1.0f, fZ+20.0f, fZ+1.0f); //Right glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(fX+1.0f, fZ+20.0f, fZ+1.0f); glVertex3f(fX+1.0f, fZ+19.0f, fZ+1.0f); glVertex3f(fX+1.0f, fZ+19.0f, fZ-1.0f); glVertex3f(fX+1.0f, fZ+20.0f, fZ-1.0f); //Back glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(fX+1.0f, fZ+20.0f, fZ-1.0f); glVertex3f(fX+1.0f, fZ-20.0f, fZ-1.0f); glVertex3f(fX-1.0f, fZ-20.0f, fZ-1.0f); glVertex3f(fX-1.0f, fZ+20.0f, fZ-1.0f); //Left glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(fX-1.0f, fZ+20.0f, fZ+1.0f); glVertex3f(fX-1.0f, fZ+20.0f, fZ-1.0f); glVertex3f(fX-1.0f, fZ-20.0f, fZ-1.0f); glVertex3f(fX-1.0f, fZ-20.0f, fZ+1.0f); //Top glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(fX-1.0f, fZ+20.0f, fZ+1.0f); glVertex3f(fX+1.0f, fZ+20.0f, fZ+1.0f); glVertex3f(fX+1.0f, fZ+20.0f, fZ-1.0f); glVertex3f(fX-1.0f, fZ+20.0f, fZ-1.0f); //Bottom glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(fX-1.0f, fZ+19.0f, fZ+1.0f); glVertex3f(fX+1.0f, fZ+19.0f, fZ+1.0f); glVertex3f(fX+1.0f, fZ+19.0f, fZ-1.0f); glVertex3f(fX-1.0f, fZ+19.0f, fZ-1.0f); //<---Dach--->// //Teil 1 glColor3f(0.7f, 0.0f, 0.3f); glVertex3f(fX-1.0f, fZ+19.0f, fZ+1.0f); glVertex3f(fX+1.0f, fZ+19.0f, fZ+1.0f); glVertex3f(fX+1.0f, fZ+19.0f, fZ-1.0f); glVertex3f(fX-1.0f, fZ+19.0f, fZ-1.0f); glEnd(); } void OpenGLInit::opengl_draw_ground(float fR, float fG, float fB){ glColor3f(fR, fG, fB); glBegin(GL_QUADS); glVertex3f(-125.0f, 0.0f, -125.0f); glVertex3f(-125.0f, 0.0f, 125.0f); glVertex3f(125.0f, 0.0f, 125.0f); glVertex3f(125.0f, 0.0f, -125.0f); glEnd(); } bool OpenGLInit::opengl_draw_scene(){ //Allgemein glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(1.0f, 1.0f, 1.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glRotatef(360 - fRotateY, 0.0f, 1.0f, 0.0f); glTranslatef( -fTransX, fTransY, -fTransZ); opengl_draw_ground(0.4f, 0.3f, 0.3f); opengl_draw_house(0.0f, 1.0f, -20.0f, 0.0f, 0.0f, 0.0f); opengl_draw_house(4.0f, 1.0f, -40.0f, 0.0f, 0.0f, 0.0f); opengl_draw_house(-7.0f, 1.0f, -35.0f, 0.0f, 0.0f, 0.0f); opengl_draw_tower(-15.0f, 1.0f, -15.0f, 0.0f, 0.0f, 0.0f); opengl_draw_tower(-12.0f, 1.0f, -19.0f, 0.0f, 0.0f, 0.0f); return true; }[/code] OpenGlInit.h [code]//<-------------OpenGLInit_H------------->// //<---Class--->// class OpenGLInit{ private: //Generell HWND hWnd; WNDCLASSEX WndClassEx; char szClassName[30]; char szWindowTitle[30]; int iHoehe; int iBreite; MSG msg; bool bKeys[256]; //OpenGl HDC hDC; HGLRC hGLRC; PIXELFORMATDESCRIPTOR pfd; int iFormat; DEVMODE dmSettings; RECT rect; DWORD dwStyle; float fRotateY; float fTransX; float fTransY; float fTransZ; float fPi180; public: //Constructor OpenGLInit(); //Variablen Funktionen inline HDC get_hDC(); inline RECT get_rect(); inline int get_iHoehe(); inline int get_iBreite(); void set_rect(int iWidth, int iHeight, bool bFullscreen); //Generelle Funktionen LRESULT CALLBACK WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); static LRESULT CALLBACK StaticWndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); bool screen_setup(HINSTANCE hInst, int iCmdShow, int iHoehe, int iBreite); void opengl_setup(); unsigned char key_pressed(); void HandleKeyboard(); void HandleMouse(); //OpenGl void opengl_reset_scene(); void opengl_resize_scene( int iBreite, int iHoehe); void opengl_draw_house(float fX, float fZ, float fY, float fR, float fG, float fB); void opengl_draw_tower(float fX, float fZ, float fY, float fR, float fG, float fB); void opengl_draw_ground(float fR, float fG, float fB); bool opengl_draw_scene(); };[/code] StdAfx.h [code]//<-------------STDAFX_H------------->// #ifndef STDAFX_H #define STDAFX_H //<---Includes--->// #include <Windows.h> #include <gl\gl.h> #include <gl\glu.h> #include <math.h> //<---Pragmas--->// #pragma comment(lib, "opengl.lib") #pragma comment(lib, "glu.lib") //#pragma comment(lib, "glut32.lib") //<---Variablen--->// /*char "Error!"[] = "Error!"; char "Fehler beim Setup des Fensters!"[] = "Fehler beim Setup des Fensters!"; char "Fehler beim Setup von OpenGl!"[] = "Fehler beim Setup von OpenGl!"; char "Fehler beim Registrieren des Fensters"[] = "Fehler beim erstellen des Fensters"; char "Fehler beim Erstellen des Fensters!"[] = "Fehler beim erstellen des Fensters!";*/ #endif[/code] main.cpp [code]//<-------------MAIN_CPP------------->// #include "StdAfx.h" #include "OpenGLInit.h" int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int iCmdShow){ OpenGLInit OpenGL_Start; //Fullscreen? if(MessageBox(NULL, "Programm in Fullscreen?", "Fullscreen?", MB_YESNO | MB_ICONINFORMATION) == IDNO){ OpenGL_Start.set_rect(OpenGL_Start.get_iHoehe(), OpenGL_Start.get_iBreite(), false); } else{ OpenGL_Start.set_rect(0, 0, true); } //<---Fenster+OpenGl--->// //Fenster+OpenGl Setup if(!OpenGL_Start.screen_setup(hInst, iCmdShow, OpenGL_Start.get_rect().right, OpenGL_Start.get_rect().bottom)){ MessageBox(NULL, "Error!", "Fehler beim Setup des Fensters!", MB_ICONERROR | MB_OK); return false; } OpenGL_Start.opengl_setup(); OpenGL_Start.opengl_reset_scene(); //Fenster ausgeben while(true){ if(OpenGL_Start.key_pressed()){ break; } else{ OpenGL_Start.HandleKeyboard(); if(!OpenGL_Start.opengl_draw_scene()){ break; } else{ SwapBuffers(OpenGL_Start.get_hDC()); } } } //<---Ende--->// MessageBox(NULL, "Programm wird beendet", "Programm Ende", MB_ICONINFORMATION | MB_OK); return 0; }[/code]
EDIT: Das mit dem eingeklappten hat nicht funktioniert, kümmer mich drum wenn ich Zeit habe
-
Wahrscheinlich willst du noch gegen
opengl32.lib
linken.
-
Sry falls ich mich jetzt besonders dumm anstelle doch wie kann ich dies beheben?
EDIT: Wie gehen hier Spoiler finds net
-
Kinetize schrieb:
Sry falls ich mich jetzt besonders dumm anstelle doch wie kann ich dies beheben?
So wie du's da
Kinetize schrieb:
#pragma comment(lib, "opengl.lib") #pragma comment(lib, "glu.lib") //#pragma comment(lib, "glut32.lib")
getan hast. Vielleicht willst du auch das
pragma
fürglut32.lib
nicht auskommentieren. Ich weiß es nicht ...Kinetize schrieb:
Wie gehen hier Spoiler finds net
Was für Spoiler und wofür?
-
Um den 1. Post wegzukürzen.
Das mit dem auskommentierten Pragma kommt von ner Versionsänderung in OpenGl aber bei den angekreideten Funktionen wird dies ja nicht einmal benutzt... (und es ging vorher...)
-
Kinetize schrieb:
Um den 1. Post wegzukürzen.
Indem du oben rechts im Post auf "editieren" klickst und einfach den Code wegschmeißt. 600 Zeilen liest sich eh niemand durch. Siehe auch Link in meiner Signatur...
-
Die angemeckerten Methoden sind inline in der .cpp. inline-Methoden müssen in jeder Übersetzungseinheit definiert werden, in der sie benutzt werden, deshalb gehören sie normalerweise in den Header. Wenn nicht, gibt es genau solche Linkerfehler. Also entweder lass das inline weg oder definier die Methoden im Header.