Eli olen tekemässä DEV-C++:lla Inside Peliohjelmointi kirjan koodinpätkää koneelle, koska siinä tullut cd oli halki(lainasin kirjan kirjastosta). No kirjoitin koodin ja siinä tuli jokin outo virhe. Tarkistin koodin muutamaan kertaan ja korjasin kirjoitusvirheet, eli koodi on täydellisesti kirjassa olevan esimerkin mukainen. Mutta virhe tulee silti.
Koodi on tässä:
// INCLUDET #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <windowsx.h> #include <stdio.h> #include <math.h> // MÄÄRITELMÄT // ikkunamääritelmät #define WINDOW_CLASS_NAME "WINCLASS1" // GLOBAALIT MUUTTUJAT // FUNKTIOT LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { // tämä on järjestelmän pääviestinkäsittelijä PAINTSTRUCT ps; // käytetään WM_PAINTissa HDC hdc; // kahva laitekontekstiin // selvitetään viesti switch(msg) { case WM_CREATE: { // alustustoimet tehdään tässä, jos tehdään // palauta onnistuminen return(0); } break; case WM_PAINT: { // korjataan ikkuna hdc = BeginPaint(hwnd, &ps); //piirto tehtäisiin tässä EndPaint(hwnd, &ps); // palauta onnistuminen return(0); } break; case WM_DESTROY: { // tapa sovellus; tämä lähettää WM_QUIT-viestin PostQuitMessage(0); // palauta onnistuminen return(0); } break; default:break; } // end switch // käsittele viestit, joista emme huolehtineet return (DefWindowProc(hwnd, msg, wparam, lparam)); } // end WinProc // WINMAIN int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) { WNDCLASSEX winclass; // tulee sisältämään luokan, jonka luomme HWND hwnd; // geneerinen ikkunakahva MSG msg; // geneerinen viesti //täytetään ensin ikkunaluokkatietue winclass.cbSize = sizeof(WNDCLASSEX); winclass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW; winclass.lpfnWndProc = WindowProc; winclass.cbClsExtra = 0; winclass.cbWndExtra = 0; winclass.hInstance = hinstance; winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); winclass.hCursor = LoadCursor(NULL, IDC_ARROW); winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); winclass.lpszMenuName = NULL; winclass.lpszClassName = WINDOW_CLASS_NAME; winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); // rekisteröi ikkunaluokka if (!RegisterClassEx(&winclass)) return(0); // luo ikkuna if (!(hwnd = CreateWindowEx(NULL, // laajennettu tyyli WINDOW_CLASS_NAME, // luokka "Your basic window", // otsikko WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0,0, // x,y aluksi 400,400, // leveys, korkeus aluksi NULL, // kahva emoon NULL, // kahva valikkoon hinstance, // tämän sovelluksen instanssi NULL))) // lisää luontiparametreja return(0); // siirrytään päätapahtumasilmukkaan while(GetMessage(&msg, NULL, 0, 0)) { // muunna kaasutusnäppäimet TranslateMessage(&msg); // lähetä viesti ikkunaproseduurille DispatchMessage(&msg); } // end while // Palataan windowsiin näin return(msg.wParam); } // end main
Ja virheilmoitus:
[Linker error] undefined reference to 'GetStockObject@4'
Id returned 1 exit status
Ja niin edelleen...
Niin voisitteko ystävällisesti auttaa?? Mulla ei ole hajuakaan mistä ja miks ja mikä toi GetStockObject@4 on? :S
Se, että virhe on linkkerivirhe, kertoo, että koodissa ei ole mitään vikaa, joten sitä ei virheen selvittämisessä tarvita.
Undefined reference -virheet kertovat, että funktion toteutusta ei löydy, vaikka funktiota koodissa yritetäänkin käyttää. Eli toisin sanoen linkkeriltä puuttuu jokin kirjasto. Google kertoo, että kyseessä voisi tällä kertaa olla olla gdi32-kirjasto.
Ratkaisusi:
Project => Project Options => Parameters => Linker
Lisää rivi "-lgdi32" (huom. -L eikä -I, jos et fontista erota :)
Kai olet valinnut projektin asetuksista "Do not create console"? Sen unohtamisesta nimittäin seuraa vastaava virheilmoitus Dev-C++:lla.
Tuo ville-v:n jippo toimi! Kiitän avusta. =)
Aihe on jo aika vanha, joten et voi enää vastata siihen.