C/C++:Kirjastojen lisääminen ja käyttö
Alla esimerkki, kuinka kirjastoja lisätään projektiin. Esimerkkinä käytetään SDL:ää.
Mitä kirjastot on? Windows-ympäristöä käyttävät ovat varmasti huomanneet DLL-tiedostoja (Dynamic Link Library) tai vanhemmiten LIB-tiedostoja. Nämä sisältävät funktioita ja määrittelyjä. Monet ohjelmat saattavat käyttää samoja tiedostoja (vaikkapa SDL.dll), jolloinka ne voi viedä Windowsin System32-hakemistoon, josta ohjelma osaa etsiä ne. Toinen vaihtoehto on pitää ne ohjelman työskentelyhakemistossa (yleisesti sama hakemisto jossa itse ohjelmakin on).
Kirjastojen hyödyt on siinä, että ne auttavat joissakin prosesseissa tarjoten valmiita funktioita. C- sekä C++-kielet eivät sisällä itsessään esimerkiksi grafiikkarutiineja, tai se on paljon vaivalloisempaa. Jos ei käytä ulkopuolisia kirjastoja, niin mahdollisessa tapauksessa joutuu kirjoittamaan piirtorutiinit itse, jolloinka assembly-kielen osaaminen on olennaista sen nopeuden ja pienen koon vuoksi.
DLL-tiedostoja voi itsekin toki luoda, mutta tässä artikkelissa sitä ei käsitellä.
Esimerkissä on käytössä CodeBlocks-ympäristö joka käyttää kääntäjänä MinGW:tä (Windowsin vastine GCC:lle).
Sisällysluettelo |
1. Asentaminen
Aivan ensimmäiseksi pitää tiedostot asentaa oikeisiin paikkoihin. Voit ladata vaikkapa SDL:n paketin SDL:n sivuilta. Tarvitset kaksi pakettia tätä varten. Toisessa on työkalut, joiden avulla voit ohjelmoida käyttäen tätä kirjastoa ja toisessa on itse ajonaikaiset tiedotot (DLL:t). Eli:
- SDL-devel-1.2.14-mingw32.tar.gz
- SDL-1.2.14-win32.zip
Pura SDL-devel...-paketti mihin tahdot ja mene sen luoman hakemiston sisälle. Sisällä on kaksi tärkeää hakemistoa: include sekä lib. Sinun on otettava selvää, missä hakemistossa kääntäjäsi on. Jos käytät Code::Blocksia, niin se voi olla esimerkiksi: C:\Program Files\CodeBlocks\MinGW\ Tästä hakemistossa löytyy kansiot Include sekä Lib. Siirrä SDL:n vastaavista hakemistoista MinGW:n vastaaviin tiedostot. Esimerkiksi SDL:n Include-hakemistossa on SDL-niminen hakemisto. Kopioi tai siirrä se sellaisenaan MinGW:n Include-hakemistoon ja tee sama Lib-hakemistojen kanssa.
Nyt MinGW osaa etsiä nämä tiedostot, kun ohjelma käännetään ja linkataan toimivaksi kokonaisuudeksi.
Seuraavaksi puretaan SDL:n toinen paketti, joka voi olla nimeltään esimerkiksi SDL-1.2.14... Tämän sisällä on SDL.dll-tiedosto. Voit siirtää sen joko Windowsin System32-hakemistoon tai sinne, missä projektisi sijaitsee, kuten aikaisemmin mainittiin.
Linkitys
Luo uusi projekti CodeBlocksissa (file -> new -> project -> console application ...) Tarkista, että projektityyppinä on console application. Kun uusi projekti on luotu, voidaan tehdä esimerkkikoodi, joka käynnistää SDL:n, luo sille ikkunan ja sammuu sekunnin jälkeen.
//lisätään SDL:n otsikkotiedostot projektiin. #include <SDL/SDL.h> /* Otetaan määrittely pois, sillä monissa ympäristöissä se saattaa luoda virheilmoituksen: 'undefined reference to `_Win;ain@16'' Tämä korjaa ongelman. */ #undef main int main() { if( SDL_Init(SDL_INIT_VIDEO) < 0 ) // Jos palautettava arvo on vähemmän kuin 0 on sattunut virhe. { fprintf(stderr, "SDL:n alustus ei onnistunut: %s\n", SDL_GetError()); // Kirjoitetaan stderr-tiedostoon virheilmoitus. return 0; // lopetetaan ohjelma } //jos päästiin tänne asti, on SDL alustettu oikein. SDL_Surface * screen; //luodaan pinta, jonka nimi on 'screen'. screen = SDL_SetVideoMode(1024, 768, 16, SDL_HWSURFACE); //määritellään pinta itse ikkunaksi. SDL_Delay(1000); //odotetaan 1000 millisekuntia. SDL_Quit(); //ja sitten lopetetaan SDL turvallisesti ja oikealla tapaa. return 0; //poistutaan ohjelmasta }
Mutta jos nyt koittaa kääntää ohjelman, se ilmoittaa muutaman rivin verran virheitä, mikä johtuu siitä, ettet ole linkittänyt itse SDL:ää mukaan projektiin.
Linkittäminen on helppoa: Avaa Build Options -sivu (project -> build options), avaa välilehti 'linker settings' ja kirjoita 'other linker options'-otsikon alla olevaan laatikkoon:
- -lSDL;
-l tarkoittaa, että linkitetään mukaan jokin kirjasto. Ja jos olet oikein asettanut SDL:n tiedostot kääntäjälle, niin se löytää SDL:n nyt. Jos tiedät missä SDL:n lib-tiedostot ovat, voit myös etsiä ne käsin lisäämällä rivejä 'Link libraries'-tekstin alapuolella olevaan laatikkoon.
Kun tämä on tehty, pitäisi olla toimiva ohjelma.
Ajo ja DLL-tiedostot
Näppäinyhdistelmällä CTRL+F9 kääntää CodeBlocks projektin toimivaksi ohjelmaksi. Jos kaikki on mennyt oikein, mitään virheilmoitusta ei tule ja ohjelma on itsensä puolesta valmis. Jotta SDL toimii, pitää ohjelman löytää tarvittavat tiedostot (tässä tapauksessa SDL.dll). Se voi sijaita samassa hakemistossa itse käännetyn exe-tiedoston kanssa tai Windowsin System32-hakemistossa. Muussa tapauksessa syntyy virhe ja ohjelma palauttaa virheilmoituksen sammuen siihen.
Eli lisää SDL.dll jompaan kumpaan yllä mainittuun hakemistoon ja nyt voit kokeilla ohjelman ajamista. Ajaminen onnistuu joko näppäinyhdistelmällä CTRL+F10 tai menemällä hakemistoon jossa exe-tiedosto on ja tuplaklikkaamalla sitä.
Jos kaikki on mennyt oikein, pitäisi syntyä ikkuna jonka sisältö on täysin musta ja tämä katoaa sekunnin kuluttua.
Virhetilanteet
SDL.h no such fire or directory
CodeBlocks ei löydä SDL:n otsikkotiedostoa. Tarkista että olet ohjelmoiden mukaisesti asentanut sen MinGW:n Include-hakemistoon. Jos SDL.h on suoraan Include-hakemistossa, on ohjelman alkuun kirjoitettava näin:
#include <SDL.h>Jos taas Include-hakemistossa on SDL-kansio jossa itse otsikkotiedostot ovat, niin seuraavasti:
#include <SDL/SDL.h>Tämä on todennäköinen syy virheeseen.
Saan seuraavanlaisen listan virheitä
obj\Release\main.o:main.cpp:(.text+0x20)||undefined reference to `_SDL_Init'| obj\Release\main.o:main.cpp:(.text+0x4b)||undefined reference to `_SDL_SetVideoMode'| obj\Release\main.o:main.cpp:(.text+0x57)||undefined reference to `_SDL_Delay'| obj\Release\main.o:main.cpp:(.text+0x5c)||undefined reference to `_SDL_Quit'| obj\Release\main.o:main.cpp:(.text+0x65)||undefined reference to `_SDL_GetError'| ...
Tämä johtuu väärästä linkitystavasta. Tarkista linkitys ja että se on -lSDL eikä -SDL.
Ohjelma ilmoittaa, ettei löydä SDL.dll-tiedostoa
Laita tiedosto joko samaan hakemistoon jossa on exe-tiedostokin, tai Windows-järjestelmäsi System32-hakemistoon.
Saan seuraavanlaisen virheilmoituksen: 'undefined reference to `_Win;ain@16
Olet unohtanut kirjoittaa otsikkotiedostojen jälkeen seuraavan rivin:
#undef main