Ongelma SDL_ttf-kirjaston kanssa

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
9276
Äänestä

Muut lukivat myös

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.

Äänestä
  • 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.

    Äänestä

  • Uninen kirjoitti:

    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.

    Äänestä

  • Uninen kirjoitti:

    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

    Äänestä

  • Uninen kirjoitti:

    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.

    Äänestä

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.

Äänestä
  • "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" //

    Äänestä

  • Uninen kirjoitti:

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

    Äänestä

  • The Real J. kirjoitti:

    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.

    Äänestä

Kommentoi aloitusta


The Real J. kirjoitti:

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

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu