Main menu:

Site search

Categories

février 2008
L M M J V S D
 123
45678910
11121314151617
18192021222324
2526272829  

Archive

C++ – Makefile générique

Voilà, vous avez pris un peu d’assurance, vous commencez à diviser votre code en plusieurs unités (ce qui est une bonne pratique) et vous avez plusieurs fichiers à compiler et à lier ensemble pour en faire une application. Inconvénient, la ligne de commande à taper au clavier dans une console devient beaucoup trop longue et impossible à gérer surtout si en plus vous utilisez quelques librairies. La solution est d’utiliser un fichier appelé makefile. Un makefile regroupe toutes les directives nécessaires au compilateur et au lieur pour créer votre exécutable.

Je vous propose ci-dessous un makefile générique qui devrait fonctionner dans la plupart des cas:

CC = g++
CFLAGS = -Wall
EXEC_NAME = nom_de_votre_exécutable
INCLUDES =
LIBS =
OBJ_FILES = fichier_1.o fichier_2.o
INSTALL_DIR = /usr/bin

all : $(EXEC_NAME)

clean :
  rm $(EXEC_NAME) $(OBJ_FILES)

$(EXEC_NAME) : $(OBJ_FILES)
  $(CC) -o $(EXEC_NAME) $(OBJ_FILES) $(LIBS)

%.o: %.cpp
  $(CC) $(CFLAGS) $(INCLUDES) -o $@ -c $<

%.o: %.cc
  $(CC) $(CFLAGS) $(INCLUDES) -o $@ -c $<

%.o: %.c
  gcc $(CFLAGS) $(INCLUDES) -o $@ -c $<

install :
  cp $(EXEC_NAME) $(INSTALL_DIR)

Voyons comment vous pouvez customiser ce makefile pour qu’il s’adapte à vos besoins.

CC= le compilateur que vous utiliser. Ici, c’est g++ mais ça pourrait être un autre.

CFLAGS = les options à passer au compilateur. Dans ce cas-ci, -Wall active tous les warnings.

EXEC_NAME = le nom de l’exécutable que vous désirez.

INCLUDES = le chemin vers les fichiers header nécessaire à la compilation. Par exemple, si vous utilisez la glib2, vous écrirez
INCLUDES = -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include
Notez le switch -I devant le chemin.

LIBS = le chemin vers les librairies que vous utilisez. Par exemple dans le cas de la glib2 LIBS = -lglib-2.0 Le switch est -l. Si vous devez ajoutez une librairie statique et non plus un chemin vous ajoutez cette librairie avec son chemin directement. Pour reprendre notre exemple et y ajouter la librairie statique /usr/lib/libgpod.so, vous le faites sur la même ligne et sans switch: LIBS = /usr/lib/libgpod.so -lglib-2.0

OBJ_FILES = la liste des fichiers objets que vous devez obtenir.

all : $(EXEC_NAME) est ce qui va être appelé par make lorsque vous taper $ make dans une console.

clean : appelé par make lorsque vous taper $ make clean dans une console. Ici, cela delete les fichiers .o du répertoire.

install : appelé par make lorsque vous taper $ make install dans une console. Ici, cela copie l’exécutable dans le répertoire INSTALL_DIR qui dvrait se trouver dans le path.

Le reste sont des directives pour le compilateur et le lieur leur disant quoi faire en présence d’un fichier .cpp, .cc ou .c

ATTENTION: les lignes qui sont indentées le sont au moyen d’un caractère TAB et non pas d’espaces. C’est important.

Si vous utilisez Geany, L’option Make All dans le menu Construire appelle make et lance le all: de votre makefile.

Autre avantage des makefiles, seuls les fichiers modifiés ont besoin d’être recompilés. Make examine automatiquement les fichiers, détermine ceux qui doivent être recompilés, lance le compilateur et s’il y a lieu le lieur (linker). C’est une vrai facilité et un réel gain de temps pour le programmeur.