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.
En dehors des sources de ce repos, on peut aussi retrouver la miniLibX ici :
- minilibX originale de 2014 mlx-2014-01-06.tgz
- minilibX version native MacOS X (< El Capitan) mlx-macosx-2015-03-10.tgz
- minilibX pour MacOS X El Capitan mlx-macosx-el-capitan-2015-11-05.tgz
- minilibX pour MacOS X Sierra mlx-macosx-sierra-2016-10-17.tgz
Toutes les fonctions et la documentation se trouve dans la version PDF des manuels (attention, la version native Mac OSX possède certaines différences, je vous invite à lire les headers):
- man 3 mlx
- man 3 mlx_loop
- man 3 mlx_new_image
- man 3 mlx_new_window
- man 3 mlx_pixel_put
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.
~ $ cd minilibx
~/minilibx $ make
~/minilibx $ cd test
~/minilibx/test $ ./mlx-test # Vous permet de savoir si la compilation de la lib a réussi
~/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.
~/minilibx $ sudo cp mlx.h /usr/X11/include
~/minilibx $ sudo cp libmlx.a /usr/X11/lib
~/minilibx $ sudo cp libmlx_intel-mac.a /usr/X11/libComme 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):
~ $ gcc -I /usr/X11/include -g -L /usr/X11/lib -lX11 -lmlx -lXext <fichier(s) .c>
~ $ ./a.out- Soit vous utilisez les nouvelles lib natives MacOS X et il faut ajouter les flags
-framework OpenGL -framework AppKiten 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 sudocp ... /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.:
~ $ gcc -I /usr/X11/include -g -L /usr/X11/lib -l mlx -framework OpenGL -framework AppKit <fichier(s) .c>
~ $ ./a.outDans les deux cas, une fenêtre noire titrée "Hello world" devrait s'ouvrir.
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
Pour plus d'info : https://achedeuzot.me/2014/12/20/installer-la-minilibx/