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 mainJa 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.