-
Makefile et commande ar
Bonjour,
J'ai un makefile à faire dans le cadre de mon projet mais je n'arrive pas à trouver comment faire pour que tous les .o soient regroupées et que çà crée un .a à la fin du make.
Voici le makefile :
SOURCES=main.cpp fonctions.cpp
EXECUTABLE=monprogramme
CC=gcc
CXXFLAGS=-c -Wall
LDFLAGS=
OBJECTS=$(SOURCES:.cpp=.o)
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
.cpp.o:
$(CC) $(CXXFLAGS) $< -o $@
.PHONY: clean
clean:
rm -f *.o $(EXECUTABLE)
ET je voudrais faire en sorte d'ajouter dans ce makefile la commande :
ar cq libfoncs.a main.o fonctions.o
Savez-vous où je dois mettre cette ligne pour qu'elle soit exécuté ?
Merci pour vos réponses.
-
Bonjour,
Avant toute chose, as-tu l'habitude des Makefile ? Sais-tu bien comment ils fonctionnent et à quoi ils servent, ou faut-il revenir un peu dessus ?
Concernant tes libs statiques, un fichier « *.a » est une archive créée avec la commande historique « ar » qui, en gros, concatène tous les fichiers passés les uns à la suite des autres. Donc, une lib statique sous UNIX est un gros fichier qui contient tous les *.o à l'intention du compilateur, sans autre forme de procès. Mais un fichier « *.a » peut contenir n'importe quoi. Ce n'est pas forcément en soi une bibliothèque.
Du coup, dans « ar cq », il faudrait déjà retirer « q » (Quick append), qui sert à ajouter directement les fichiers à la fin de l'archive existante, sans même vérifier s'ils sont déjà dedans. Donc, ton archive grossirait à chaque recompilation. À la place, à chaque fois que l'on reconstruit l'archive, on souhaite effacer la précédente et la recréer à partir des fichiers que l'on souhaite y intégrer.
Ensuite, on souhaite reconstruire l'archive si les fichiers qu'elle est censée contenir sont plus récents qu'elles, ou s'ils n'existent pas (auquel cas, il faudra reconstruire ces fichiers auparavant). Il s'agit donc d'une dépendance au même titre que les fichiers *.c. Donc, il faut créer une règle qui porte le nom de l'archive à créer, et qui contienne les dépendances, c'est-à-dire les fichiers à y intégrer.
Code:
libfoncs.a: main.o fonctions.o
Ensuite, tu y ajoutes la commande que tu nous a donné, en remplaçant le nom de l'archive à créer par le nom de la cible, donc $@, suivi de la liste des fichiers à inclure, donc les dépendances, donc avec $^ .
Enfin, le succès de ton projet dépend — entre autres — de la bonne création de ce fichier. Donc la cible « all » doit avoir pour dépendance le nom de cette archive, pour qu'elle soit créée si besoin quand tu fais « make », ce que tu cherches à faire.
-
Bonsoir,
J'ai finalement résolu mon problème. Merci bien !