Appuyez sur Entrée pour voir vos résultats ou Echap pour annuler.

Installer la miniLibX

La miniLibX (ou mlx pour les intimes) est la librairie utilisée à Epitech et 42 pour les projets d’infographie: fil de fer, raytracer, …

Ses caractéristiques principales sont l’aspect très simple des fonctions disponibles: ouvrir une fenêtre, afficher un pixel à l’écran, enregistrer un appel de touche (clavier ou souris). C’est une librairie basée sur l’environnement graphique X.org. Cet article est principalement là pour regrouper des ressources utiles sur la miniLibX, sur ses manuels et fichier associés. Les sources sont également fournies pour vous permettre de les installer chez vous et de faire tourner vos projets sur vos ordis persos.

Les fichiers de la miniLibX

Installation avec XQuartz

Voici un tutoriel pour installer la miniLibX (sur un MacOS X ou tout autre distribution proche). Si vous voulez vous économiser du temps, il existe un package pour MacOS X qui vous fera ça automatiquement: minilibx.pkg (créé par Mehdi Laouichi). Attention, il semblerait que cela ne fonctionne pas très bien voir plus du tout sur les dernières versions de MacOS X (> El Capitan). Je vous conseille de prendre les versions natives MacOS X pour vos projets.

Avant de commencer, n’oubliez pas d’installer le serveur X.org si vous ne l’avez pas déjà. Sous MacOS X, le plus simple est d’installer XQuartz (miroir de XQuartz 2.7.11)

Il va nous falloir compiler la miniLibX puis copier les fichiers générés dans divers dossiers du système.

achedeuzot@~ $ wget http://files.achedeuzot.me/42/mlx/mlx-2014-01-06.tgz
achedeuzot@~ $ tar -xzf mlx-2014-01-06.tgz
achedeuzot@~ $ cd minilibx
achedeuzot@~/minilibx $ make
achedeuzot@~/minilibx $ cd test
achedeuzot@~/minilibx/test $ ./mlx-test # Vous permet de savoir si la compilation de la lib a réussi
achedeuzot@~/minilibx/test $ cd ..

Maintenant que la miniLibX est compilée et testée, nous allons l’installer sur le système, c’est à dire copier les fichiers vers des dossiers qui sont accessibles pour tout le monde.

achedeuzot@~/minilibx $ sudo cp mlx.h /usr/X11/include
achedeuzot@~/minilibx $ sudo cp libmlx.a /usr/X11/lib
achedeuzot@~/minilibx $ sudo cp libmlx_intel-mac.a /usr/X11/lib

Pour finir, et voir si votre installation a fonctionné, utilisez l’exemple ci-dessous. N’oubliez pas de supprimer les fichiers générés par l’archive mlx, sauf si vous voulez mettre les mains dans le cambouis et voir comment ça marche.

Installation native Mac OSX

Quasiment similaire à l’installation avec XQuartz. Prenez la version compatible avec votre version de MacOS X (voir début de l’article). Voici les instructions pour MacOS X Sierra:

achedeuzot@~ $ wget http://files.achedeuzot.me/42/mlx/mlx-macosx-sierra-2016-10-17.tgz
achedeuzot@~ $ tar -xzf mlx-macosx-sierra-2016-10-17.tgz
achedeuzot@~ $ cd minilibx_macos
achedeuzot@~/minilibx_macos $ make
achedeuzot@~/minilibx_macos $ sudo cp mlx.h /usr/X11/include
achedeuzot@~/minilibx_macos $ sudo cp libmlx.a /usr/X11/lib

Même chose ici, vous pouvez maintenant tester si votre installation a fonctionné avec l’exemple ci-dessous. Attention, cette version de la mlx a quelques comportements différents à la version XQuartz. Vous pouvez ensuite supprimer le dossier et l’archive de la minilibX.

Exemples

Hello World

Comme d’habitude, le fameux Hello World (cf titre de la fenêtre) pour commencer:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <mlx.h>

typedef struct    data_s
{
    void          *mlx_ptr;
    void          *mlx_win;
}                 data_t;

int main(void)
{
    data_t        data;

    if ((data.mlx_ptr = mlx_init()) == NULL)
        return (EXIT_FAILURE);
    if ((data.mlx_win = mlx_new_window(data.mlx_ptr, 640, 480, "Hello world")) == NULL)
        return (EXIT_FAILURE);
    mlx_loop(data.mlx_ptr);
    return (EXIT_SUCCESS);
}

Attention, pour la compilation, il ya deux cas.

  • Soit vous utilisez les « vieilles » versions utilisant X11 et il faut lancer ceci (attention à ne pas oublier les flags et attention à leur ordre):
achedeuzot@~ $ gcc -I /usr/X11/include -g -L /usr/X11/lib -lX11 -lmlx -lXext <fichier(s) .c>
achedeuzot@~ $ ./a.out
  • Soit vous utilisez les nouvelles lib natives MacOS X et il faut ajouter les flags -framework OpenGL -framework AppKit  en plus. Vous remarquerez que même si cette libraire n’utilise plus X.org/X11, j’utilise toujours les chemins vers X11. C’est parce que lors de l’installation, nous avons copié la libmlx dans les dossiers X11 (souvenez-vous des sudo cp ... /usr/X11/...). Il faut donc ajouter les chemins de X11 pour la compilation. Si votre libmlx est ailleurs, pas besoin d’ajouter les chemins d’include vers X11.:
achedeuzot@~ $ gcc -I /usr/X11/include -g -L /usr/X11/lib -l mlx -framework OpenGL -framework AppKit <fichier(s) .c>
achedeuzot@~ $ ./a.out

Dans les deux cas, vous verrez ceci:

Hello World en miniLibX

Tadam ! Il ne reste plus qu’à réaliser votre projet mlx et en mettre plein de yeux à ceux qui testeront votre logiciel 😀

Quelques petits pièges à éviter

Si le sujet ne précise pas la possibilité d’utiliser la fonction système exit(), c’est une erreur de sujet. En effet, il est impossible de quitter « proprement » la miniLibX, il faut forcément faire un exit() ou quitter sauvagement via le bouton « Fermer » de la fenêtre. D’anciennes légendes parlent d’une fonction mlx_loop_stop() mais elle n’est pas présente dans les sources fournies ici.

Lorsque vous initialisez la mlx, avec mlx_init(), attention aux environnements shell vides, c’est à dire, n’oubliez pas de protéger votre mlx_init() car si votre appel de fonction n’est pas correctement protégé, vous aurez un joli plantage en règle, allez tout droit en prison, sans passer par la case départ, ne touchez pas 20 000€. La commande pour tester cela vous même: $ env -i <votre-executable> S’il plante, c’est que vous ne l’avez pas bien protégé 😉

Si vous avez utilisé un paquet Debian ou une autre méthode d’installation, il est possible de devoir rajouter un dossier d’include pour la compilation: -I /opt/X11/include/X11

Bon code à tous !