Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Autatteko minuakin linkkerivirheessä? =)

verho88 [03.01.2006 22:02:08]

#

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

Metabolix [03.01.2006 22:21:13]

#

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 :)

ville-v [04.01.2006 12:45:58]

#

Kai olet valinnut projektin asetuksista "Do not create console"? Sen unohtamisesta nimittäin seuraa vastaava virheilmoitus Dev-C++:lla.

verho88 [04.01.2006 15:22:30]

#

Tuo ville-v:n jippo toimi! Kiitän avusta. =)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta