Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 27/11/2018, à 09:41

Anard

Première tentative d'utilisation de SDL

Bonjour,

Je cherche à essayer de faire un petit logiciel graphique en C. Je découvres un peu alors j'y vais pas à pas.
Pour le moment, je voudrais simplement ouvrir un fichier texte et l'afficher ligne par ligne dans une belle fenêtre avec une belle police.
J'ai essayé de ne faire qu'ouvrir une fenêtre avec la SDL et ça fonctionnait bien. Mais dès que je cherche à utiliser une fonction de SDL_TTF, il ne veut plus compiler.
J'ai bien installé libsdl1.2-dev, libsdl-image1.2-dev et libsdl-ttf2.0-0-dev par sudo apt install.
J'ai d'ailleurs bien vérifié que j'avais un SDL_ttf.h dans /usr/include/SDL/
J'utilise pour le moment uniquement gcc pour la compilation et voici ce qu'il me dit :

anard@Ubuntu-SSD:~/Bureau/EssaiC$ gcc -lSDL -lSDL_ttf -o exec main.c `sdl-config --cflags --libs`
/tmp/ccyS9qPx.o : Dans la fonction « main » :
main.c:(.text+0x228) : référence indéfinie vers « TTF_Init »
main.c:(.text+0x239) : référence indéfinie vers « TTF_OpenFont »
main.c:(.text+0x27f) : référence indéfinie vers « TTF_CloseFont »
main.c:(.text+0x284) : référence indéfinie vers « TTF_Quit »
main.c:(.text+0x353) : référence indéfinie vers « TTF_RenderText_Blended »
main.c:(.text+0x3fc) : référence indéfinie vers « TTF_RenderText_Blended »
main.c:(.text+0x4a1) : référence indéfinie vers « TTF_CloseFont »
main.c:(.text+0x4a6) : référence indéfinie vers « TTF_Quit »
collect2: error: ld returned 1 exit status
anard@Ubuntu-SSD:~/Bureau/EssaiC$ 

J'ai essayé avec et sans -lSDL et -lSDL_ttf sans différence.
Si je commente dan mon code la ligne #include <SDL/SDL_ttf.h>, alors plein d'autres erreurs apparaissent, ce qui prouve qu'il trouve bien mon fichier SDL_ttf.h

Auriez-vous une idée d'où peut venir mon problème ? Merci beaucoup.
Pour info, voici mon code :

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>

int WaitForClic()
{
    int continuer = 1;
    SDL_Event event;
 
    while (continuer)
    {
        SDL_WaitEvent(&event);
        switch(event.type)
        {
            case SDL_MOUSEBUTTONUP:
            	return 1;
            case SDL_QUIT:
                continuer = 0;
            default:
            	break;
        }
    }
    return 0;
}

int WriteLogFile(char str[100]) {
	FILE* fichier = fopen ("essaiC.log", "a+");
	
	if (fichier == NULL) {
		printf("Impossible d'ouvrir le fichier log");
		return EXIT_FAILURE;
	}
	fprintf(fichier, "%ld: %s\n", time(NULL), str);
	
	fclose(fichier);
	return EXIT_SUCCESS;
}

int main(int argc, char* argv[]) {
	SDL_Surface *ecran = NULL, *texte[5];
	Uint32 couleurFond;

	FILE* fichier = NULL;
	char str[100];
	SDL_Color texteNoir = {0,0,0};
	SDL_Color texteJaune = {234,188,6};
	TTF_Font *police = NULL;
	SDL_Rect position;
	position.x = 50;
	unsigned char i=0;

	// Ouverture de la fenêtre
	if (SDL_Init(SDL_INIT_VIDEO)) {
		WriteLogFile ("Ouverture de la SDL impossible");
		return EXIT_FAILURE;
	}
	WriteLogFile ("Ouverture de la SDL réussie");
	ecran = SDL_SetVideoMode(1920, 1080, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
	SDL_WM_SetCaption("Essai Lecture",NULL);
	couleurFond = SDL_MapRGB(ecran->format, 244, 229, 200);
	SDL_FillRect(ecran, NULL, couleurFond);
	SDL_Flip(ecran);

	// Police	
	TTF_Init();
	police = TTF_OpenFont("Purisa.ttf",55);
	
	// Ouverture du fichier
	if ((fichier = fopen("Essai.txt","r")) == NULL) {
		WriteLogFile("Ouverture du fichier impossible");
		TTF_CloseFont(police);
		TTF_Quit();
		for (i=0; i<5; i++) SDL_FreeSurface(texte[i]);
		SDL_Quit();
		return EXIT_FAILURE;
	}
	WriteLogFile("Ouverture du fichier réussie");


	while (WaitForClic()) {
		if (fgets(str, 100, fichier) == NULL) {
			for (i=4; i; i--) texte[i] = NULL;
			texte[0] = TTF_RenderText_Blended(police,"\n... fin ...\n\n",texteNoir);
			SDL_BlitSurface(texte[0], NULL, ecran, &position);
			rewind (fichier);
			position.y = 1000;
		}
		else {
			if (!i) {
				for (i = 4; i; i--) texte[i] = NULL;
			}
			texte[i] = TTF_RenderText_Blended(police,str,texteNoir);
			position.y = 50 + i*60;
			SDL_BlitSurface(texte[i], NULL, ecran, &position);
			i++;			
			if (i > 4) i = 0;
		}

		SDL_Flip(ecran);
	}
	

	// Fermeture
	TTF_CloseFont(police);
	TTF_Quit();
	fclose (fichier);
	for (i=0; i<5; i++) SDL_FreeSurface(texte[i]);
	SDL_Quit();
	return EXIT_SUCCESS;
}

"iMack" : GA-H97M-D3H, Intel i5 4460, 16Go DDR3, Intel HD4600, SSD 256+120 / Bootloader Clover - macOS Mojave / Gentoo-Xfce
"Portable" : HP Pavilion DV3500, Intel T6400, 4Go, HDD 500Go / Grub2 - Gentoo-Xfce

Hors ligne

#2 Le 27/11/2018, à 11:53

pingouinux

Re : Première tentative d'utilisation de SDL

Bonjour,
S'il te manquait le fichier SDL_ttf.h, tu obtiendrais plutôt un message de ce genre

main.c:5:25: fatal error: SDL/SDL_ttf.h: No such file or directory

Je pense qu'il te manque la librairie contenant les fonctions TTF_init, TTF_OpenFont, etc....
Quel est le retour de cette commande ?

sdl-config --cflags --libs

Dernière modification par pingouinux (Le 27/11/2018, à 12:09)

Hors ligne

#3 Le 30/11/2018, à 19:46

Anard

Re : Première tentative d'utilisation de SDL

Bonjour,
J'ai fini par trouver par moi-même (j'ai eu une coupure d'internet pendant 3 jours mad).
Ca fonctionne très bien avec cette commande pour compiler :

gcc -o exec main.c `sdl-config --cflags --libs` -lSDL_ttf -lSDL_image

En fait j'ai compris ça en tapant man sdl-config et en comprenant ainsi par quoi était remplacé mon sdl-config --libs :

anard@Ubuntu-SSD:~$ sdl-config --libs
-L/usr/lib/x86_64-linux-gnu -lSDL
anard@Ubuntu-SSD:~$

Est-ce qu'il serait possible de rajouter par défaut dans l'option "--libs" les "-lSDL_image" et "-lSDL_ttf" ?


"iMack" : GA-H97M-D3H, Intel i5 4460, 16Go DDR3, Intel HD4600, SSD 256+120 / Bootloader Clover - macOS Mojave / Gentoo-Xfce
"Portable" : HP Pavilion DV3500, Intel T6400, 4Go, HDD 500Go / Grub2 - Gentoo-Xfce

Hors ligne