I am using debian linux and I cannot seem to get sdl_ttf working. It compiles fine but the program quits due to error checking in the code. It returns false at the ttf_init() part. Do not know if this makes a difference but I got sdl and ttf via apt.
Heres my compilation command :

g++ lesson07.cpp -o test -lSDL -lSDL_image -lSDL_ttf -lfreetype

heres my code (actually its a tutorials code. I do not claim that I made it or whatever)

/*This source code copyrighted by Lazy Foo' Productions (2004-2007) and may not be redestributed without written permission.*/

//The headers
#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include "SDL/SDL_ttf.h"
#include <string>

//Screen attributes
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;

//The surfaces
SDL_Surface *background = NULL;
SDL_Surface *message = NULL;
SDL_Surface *screen = NULL;

//The event structure
SDL_Event event;

//The font that's going to be used
TTF_Font *font = NULL;

//The color of the font
SDL_Color textColor = { 255, 255, 255 };

SDL_Surface *load_image( std::string filename ) 
{
    //The image that's loaded
    SDL_Surface* loadedImage = NULL;
    
    //The optimized surface that will be used
    SDL_Surface* optimizedImage = NULL;
    
    //Load the image
    loadedImage = IMG_Load( filename.c_str() );
    
    //If the image loaded
    if( loadedImage != NULL )
    {
        //Create an optimized surface
        optimizedImage = SDL_DisplayFormat( loadedImage );
        
        //Free the old surface
        SDL_FreeSurface( loadedImage );
        
        //If the surface was optimized
        if( optimizedImage != NULL )
        {
            //Color key surface
            SDL_SetColorKey( optimizedImage, SDL_RLEACCEL | SDL_SRCCOLORKEY, SDL_MapRGB( optimizedImage->format, 0, 0xFF, 0xFF ) );
        }
    }
    
    //Return the optimized surface
    return optimizedImage;
}

void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip = NULL )
{
    //Holds offsets
    SDL_Rect offset;
    
    //Get offsets
    offset.x = x;
    offset.y = y;
    
    //Blit
    SDL_BlitSurface( source, clip, destination, &offset );
}

bool init()
{
    //Initialize all SDL subsystems
    if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
    {
        return false;    
    }
    
    //Set up the screen
    screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );
    
    //If there was in error in setting up the screen
    if( screen == NULL )
    {
        return false;    
    }
    
    //Initialize SDL_ttf
    if( TTF_Init() == -1 )
    {
        return false;    
    }
    
    //Set the window caption
    SDL_WM_SetCaption( "TTF Test", NULL );
    
    //If everything initialized fine
    return true;
}

bool load_files()
{
    //Load the background image
    background = load_image( "background.png" );
    
    //Open the font
    font = TTF_OpenFont( "lazy.ttf", 28 );
    
    //If there was a problem in loading the background
    if( background == NULL )
    {
        return false;    
    }
    
    //If there was an error in loading the font
    if( font == NULL )
    {
        return false;
    }
    
    //If everything loaded fine
    return true;    
}

void clean_up()
{
    //Free the surfaces
    SDL_FreeSurface( background );
    SDL_FreeSurface( message );
    
    //Close the font that was used
    TTF_CloseFont( font );
    
    //Quit SDL_ttf
    TTF_Quit();
    
    //Quit SDL
    SDL_Quit();
}

int main( int argc, char* args[] )
{
    //Quit flag
    bool quit = false;
    
    //Initialize
    if( init() == false )
    {
        return 1;
    }
    
    //Load the files
    if( load_files() == false )
    {
        return 1;    
    }
    
    //Render the text
    message = TTF_RenderText_Solid( font, "The quick brown fox jumps over the lazy hound", textColor );
    
    //If there was an error in rendering the text
    if( message == NULL )
    {
        return 1;    
    }
    
    //Apply the images to the screen
    apply_surface( 0, 0, background, screen );
    apply_surface( 0, 200, message, screen );
    
    //Update the screen
    if( SDL_Flip( screen ) == -1 )
    {
        return 1;    
    }
    
    //While the user hasn't quit
    while( quit == false )
    {
        //While there's events to handle
        while( SDL_PollEvent( &event ) )
        {
            //If the user has Xed out the window
            if( event.type == SDL_QUIT )
            {
                //Quit the program
                quit = true;
            }    
        }
    }
    
    //Free surfaces and font then quit SDL_ttf and SDL 
    clean_up();
    
    return 0;    
}

Are you sure you have the SDL TTF runtime libraries installed properly? The code looks fine at first glance, but I don't really have time to run this code on my system right now, so I might in a few hours.

Are you sure you have the SDL TTF runtime libraries installed properly?

Apt-get says that I have the following packages installed that relate to ttf:

libfreetype6, libsdl-ttf2.0-0, libsdl-ttf2.0-dev, libttf2, and libttf-dev

The strange thing is I have compiled The Battle for Wesnoth, Sauerbraten, and Action Cubers fine, all of which use ttf fonts. So is it the code? (sigh) My debian install seems rife with problems...;)

Your header paths imply that they are a in a sub directory of your current directory.
Is that true?
In other words, if your current directory is
*/foo , the program will look for those headers in */foo/SDL
Otherwise the path is incomplete and/or incorrect.

From what you posted , I suspect that htses files may not exisit or are not where the program is looking for them.


do a dbupdate command (HD will churn for a few minutes) then type
locate SDL.h
This will return the path to that header if it exists.

do a dbupdate command (HD will churn for a few minutes) then type
locate SDL.h
This will return the path to that header if it exists.

Sorry, My dyslexia kicked in for a second...
the command is updatedb

ok I located the SDL stuff, its in /usr/include/SDL/*.
So it should be in the specified directory. SDL_ttf.h
is in there..I wonder why its acting up..

Naw, just fix the paths in the include directive.\
Use the full path names, unless you have some compelling reason to do otherwise...

Im not sure I understand. All the SDL stuff is in /usr/include/SDL/ . So I would use SDL/foo as my includes, correct?

Im not sure I understand. All the SDL stuff is in /usr/include/SDL/ . So I would use SDL/foo as my includes, correct?

No. Try changing your inclusions "s with < and >, because the directory that your SDL stuff resides in is a system directory, not a home one.

Although that's very unlikely to be what's causing you problems, as the code probably wouldn't even compile if the headers aren't being included.

just chang all the include directives to absolute paths.
the first one would read:
#include "/usr/include/SDL/SDL.h"
which is the the absolute path name for THAT header. Do the rest of them using the same directory path. There is no doubt this way...

The compliler should be able to find the headers then. No gurantees that there will be no more problems, but at least that situation is handled.

Just occured to me that /user/include is probably in the standard search path for the the compiler as it is a standard system directory.
You DID say that it compiled! It would have complained about the functions if it couldn't find it's appropriate header.

Perhaps thay are incompatable versions?
anything in the doc's about the program requirements?
but hey, it's friggen Debian...who knows what lerks in the bowels of that beast?

Just occured to me that /user/include is probably in the standard search path for the the compiler as it is a standard system directory.

Which is why I said to use <> instead of quotes.

You DID say that it compiled! It would have complained about the functions if it couldn't find it's appropriate header.

Which is why I said that headers are unlikely to be causing the problems.

Perhaps thay are incompatable versions?
anything in the doc's about the program requirements?
but hey, it's friggen Debian...who knows what lerks in the bowels of that beast?

At the moment, I don't know enough about the guts of SDL to make a comment on the code. However, I'm hard at work installing SDL (I lost it when I did my hard drive wipe), and hopefully I can see if we can pinpoint this problem.

However, I'm hard at work installing SDL (I lost it when I did my hard drive wipe), and hopefully I can see if we can pinpoint this problem.

Sorry, couldn't get it working. Somehow whenever I #include the SDL headers inside a simple blank main(), it mysteriously crashes on startup. And that's statically linking SDL.

So... I guess you're on your own unless someone else has any more ideas.

THIS is why I am mad at debian:mad: It wont let me program! Allegro did not work on ubuntu and barely works on debian (it lags soooo...much), SDL is broken, ClanLib doesn't compile (another graphics library), and everything else is broken! Well whatever..thanks for your help. (NOTE: and debian is supposdly a "reliable distro", well I suppose since im taking from testing...;) )

>NOTE: and debian is supposdly a "reliable distro", well I suppose since im taking from testing...
That probably has something to do with it. While I'm sure it's entirely possible to get it running under Debian Testing, the reality is that more things need configuration to get it working.

Interestingly enough, Slackware (which is supposedly a very hardcore distro and needs tons of configuration) seems to have all the development tools set up, and settings rarely need to be tweaked to get random code downloaded from the web to compile and work.

Regardless of the system/platform you're using, libraries are a pain to work with. They make it easier for the person writing the code, but make it a thousand times more complex for the person who has to setup the compiler/linker to read in the libraries.

This article has been dead for over six months. Start a new discussion instead.