Olen ryhtynyt harjoittelemaan SDL-ohjelmointia ja työn alla on jonkinlainen peliprojekti, mutta olen törmännyt ongelmiin TTF-kirjaston kanssa. Kun yritän kääntää ohjelmaa tulee virhe:
cgameresources.o: In function `CGameResources::InitialiseView()':
/home/xxxxx/Projects/SDLGame/src/cgameresources.cpp:119: undefined reference to `TTF_RenderText_Blended'
cgameresources.o: In function `CGameResources::CleanupResources()':
/home/xxxxx/Projects/SDLGame/src/cgameresources.cpp:91: undefined reference to `TTF_CloseFont'
/home/xxxxx/Projects/SDLGame/src/cgameresources.cpp:93: undefined reference to `TTF_Quit'
cgameresources.o: In function `CGameResources::InitialiseResources()':
/home/xxxxx/Projects/SDLGame/src/cgameresources.cpp:63: undefined reference to `TTF_Init'
/home/xxxxx/Projects/SDLGame/src/cgameresources.cpp:72: undefined reference to `TTF_OpenFont'
TTF-kirjasto on asennettu (synapticissa näkyy libsdl-ttf-dev), mutta ilmeisesti kääntäjälle pitäisi mainita se jotenkin. Käytössä on KDevelop 3.5.3
cgameresources.o: In function `CGameResources::InitialiseView()':
/home/xxxxx/Projects/SDLGame/src/cgameresources.cpp:119: undefined reference to `TTF_RenderText_Blended'
cgameresources.o: In function `CGameResources::CleanupResources()':
/home/xxxxx/Projects/SDLGame/src/cgameresources.cpp:91: undefined reference to `TTF_CloseFont'
/home/xxxxx/Projects/SDLGame/src/cgameresources.cpp:93: undefined reference to `TTF_Quit'
cgameresources.o: In function `CGameResources::InitialiseResources()':
/home/xxxxx/Projects/SDLGame/src/cgameresources.cpp:63: undefined reference to `TTF_Init'
/home/xxxxx/Projects/SDLGame/src/cgameresources.cpp:72: undefined reference to `TTF_OpenFont'
TTF-kirjasto on asennettu (synapticissa näkyy libsdl-ttf-dev), mutta ilmeisesti kääntäjälle pitäisi mainita se jotenkin. Käytössä on KDevelop 3.5.3
Vastaukset 9
Vanhimmat
Tosiaankin. Olet oikeilla jäljillä.Eli tuo inisee juurikin siitä mainitsemastasi eli jonnekin sinne kdevelopin asetuksiin kertoo että käytössä myös tällasii juttui :)
En kuolemaksenikaan voi muistaa minne ja mitä, kun olen yrittänyt pysyä poissa koodeista mahdollisimman paljon. Pelkkä dev pakun asennus ei tietenkään auta yhtään mitään..
jotain tällaista kun saat tarjottua kääntäjälle:
gcc bla--blaa- sdl-config -lSDL_image -lSDL_ttf -lSDL_mixer
Eli tuo -lSDL_ttf lienee se oikea vipu :)
sdl-config lisää vain sen peruskirjaston.
Höpisen ihan omiani. Siis tietenkin nuo kääntäjän parametrit menee linkkerille joka sitten tekee tarvittavat jutut.
undefined reference eli oisko jotain määrittelemätön viittaus, näin vapaasti suomennettuna. Eli linkkeri tietää että kirjastot on olemassa, mutta ei löydä niitä :)
Tai sinne päin, mutta kuitenkin.
Eli jotain tällaista pitäisi saada kääntäjälle tarjottua ja en kyllä muista missä moiset oli Kdevelopissa, mutta eiköhän ne sieltä löydy jostain asetuksista.
gcc -sdl-config -lSDL_image -lSDL_ttf -lSDL_mixer -lfreetype
Tuo ttf luultavasti tarvii tuon lfreetypen ennen kuin homma suostuu kääntymään.
Eli voit selvittää libSDL_ttf:n (lSDL_ttf) riippuvuudet komennolla
ldd /usr/lib/libSDL_ttf.so
Se tulostaa listaa riippuvuuksista. Minulla ei nyt satu olemaan tässä asennettuna tuota ttf:ää ollenkaan niin otan esimerkkiin libSDL_mixerin:
ldd /usr/lib/libSDL_mixer-1.2.so.0
linux-gate.so.1 => (0xffffe000)
libSDL-1.2.so.0 => /usr/lib/libSDL-1.2.so.0 (0xf7e46000)
libpthread.so.0 => /lib/libpthread.so.0 (0xf7e2c000)
libmikmod.so.2 => /usr/lib/libmikmod.so.2 (0xf7ddb000)
libdl.so.2 => /lib/libdl.so.2 (0xf7dd6000)
libc.so.6 => /lib/libc.so.6 (0xf7c79000)
libm.so.6 => /lib/libm.so.6 (0xf7c50000)
/lib/ld-linux.so.2 (0xf7f57000)
eli jos nyt haluan lisätä vaikkapa tuon libmikmod.so.2 niin laitan kääntäjän parametreihin -l (niinkuin 'lib') ja mikmod ja unohdan nuo päätteet eli lisään -lmikmod "kytkimen".
Toivottavasti näillä eväillä alkaisi kääntymään.
Tämän jälkeen en enää 'spämmää' :)
Eli myös näiden järjestys on tärkeä!!
Oletetaan että jokin spaghettikoodi käyttää kaikkia noita alla mainittuja kirjastoja tällä tavalla:
gcc sdl-config -lSDL_image -lSDL_ttf -lSDL_mixer -lfreetype
muutetaan järjestystä:
gcc -lSDL_image -lSDL_ttf -lSDL_mixer -lfreetype sdl-config
tuloksena on ihan saatanan pitkä lista undefined referenceä :D
Eli jos jokin tässä tapauksessa käyttää perus SDL:llää ennen kuin se on "esitelty" niin virheiden määrä on hmm.. määrittelemätön.
Eli nämä "esittelyt" (linkitys järjestys tjms.?) pitää hoitaa siinä järjestyksessä, että kaikki tulevat keskenään tutuiksi. Ihan perusjuttu siis.. Ensin esitellään ihan niinkuin lyhyessä c-koodissakin. esim.. koodin alussa prototyyppi ja jossain ihan lopussa itse koodi. jos protoa ei olisi, niin virheitä tulisi kaikista niistä joissa ennen varsinaista koodia siihen viitataan. ;)
no tulipahan tekstiä. Nyt olen hiljaa :D
gcc sdl-config -lSDL_image -lSDL_ttf -lSDL_mixer -lfreetype
muutetaan järjestystä:
gcc -lSDL_image -lSDL_ttf -lSDL_mixer -lfreetype sdl-config
tuollaisenaan nuo ei tietenkään toimi(Tiedoksi viisastelijoille). Heitän ihan hihasta, kun en voi mitenkään nyt tässä alkaa edes testailemaan :)
Mutta varmaan ymmärsit perusidean kuitenkin.
Okei, sain nuo ongelmat poistettua kun lisäsin tuon TTF-kirjaston projektiin. Mutta uusi ongelma nosti rumaa päätään. TTF_Init onnistuu (palauttaa 0), mutta kun yritän avata fonttia:
fnt_MainFont = TTF_OpenFont("FreeSans.ttf", 64);
if (fnt_MainFont == NULL)
...käsittele virhe
Ei onnistukaan. Funktio palauttaa 0 vaikka sen pitäisi ilmeisesti palauttaa osoitin avattuun fonttiin. SDL_Error palauttaa vain "Couldn't open freesans.ttf". FreeSans-fontti ja tuo koko on kyllä asennettuna (on valittavissa fonttiasetuksista) tosin en ole varma käytetäänkö linuxissa normaalisti jotain toista formaattia ja TTF:t pitää itse alustaa.
Mikä mahtaisi mättää ? Lisäsin myös tuon freetype-kirjaston joten siitä tuskin on kiinni, ellei sitten kirjastojen määrittelyjärjestys ole olennainen.
"Couldn't open freesans.ttf"
Oletko kokeillut tarjota koko polkua tyyliin:
font = new Font("data/FreeSans.ttf", 64);
En oikein usko että kyse on nyt enää kirjastoista. Se kääntäjä kyllä osaa siitä valittaa hyvinkin ahkerasti. Ainakin tuo virhe vähän viittaisi että vain avaus epäonnistuu. Joskus tuo on varsin ärsyttävää, kun mistään ei oikein saa kaivettua että miksi ei onnistu :)
En nyt kirveelläkään saa päähäni miten tuon fonttien oletuspolun voisi määritellä(kertokoon ken tietää?), mutta tässä 'purkkaviritys' JOS vika siis on polun määrittelyssä.
//blaa blaa
#include
#include
//jne. jne.
//jne.
#define MAIN_FONT "/usr/share/fonts/TTF/mika_vain_fontti.ttf" //
Jep, fontin polusta tuo tuntuu olevan kiinni. Lisäsin koko polun:
/usr/share/fonts/truetype/freefont/FreeSans.ttf
tuohon alustukseen ja johan toimi. Alustuksessa ei tullut virhettä ja fontti tuli tyylikkäästi ruutuun. Pidemmän päälle ei taida olla kovin tyylikästä viitata polkuun (sekin voi vaihdella eri systeemeissä) joten toimivampi keino lienee kopioida tuo fonttitiedosto ohjelmahakemistoon.
Kun sen sisällyttää mukaan, niin se toimii varmemmin muissakin systeemeissä.
Jos taas haluaa "hifistellä", niin ainahan voi värkätä configure skriptiin jutut jotka etsivät pathista fontteja ja sitä rataa määrittelee ne itse koodiin...
Kaikki on mahdollista, mutta olen kyllä enemmän tuon mukaanlaiton kannalla. Kunhan muistat tarkistaa lisenssihommat jos ihan ajattelit koodejasi levittää. Kannattaa valita silloin geepeeällää ;)
Hyvä ettäö toimii. Onnea vaan koodaukseen.