DEV Community

As Manjaka Josvah
As Manjaka Josvah

Posted on

Makefile - .h - .c exemple.

Voici la structure du projet avec l'exemple sans bibliothèque statique en premier, suivi de l'exemple avec bibliothèque statique.

Structure du Projet

/mon_projet
├── Makefile
├── utils.h
├── utils.c
└── main.c
Enter fullscreen mode Exit fullscreen mode

Exemple 1 : Sans bibliothèque statique

1. Fichier d'en-tête : utils.h

#ifndef UTILS_H
#define UTILS_H

// Fonction pour additionner deux entiers
int addition(int a, int b);

#endif // UTILS_H
Enter fullscreen mode Exit fullscreen mode

2. Fichier source : utils.c

#include "utils.h"

// Implémentation de la fonction d'addition
int addition(int a, int b) {
    return a + b;
}
Enter fullscreen mode Exit fullscreen mode

3. Fichier principal : main.c

#include <stdio.h>
#include "utils.h"

int main() {
    int a = 5;
    int b = 3;
    int result = addition(a, b);

    printf("La somme de %d et %d est : %d\n", a, b, result);
    return 0;
}
Enter fullscreen mode Exit fullscreen mode

4. Makefile : Makefile

# Variables
CC = gcc
CFLAGS = -Wall -g
SOURCES = main.c utils.c
OBJECTS = $(SOURCES:.c=.o)
DEPENDS = $(OBJECTS:.o=.d)
TARGET = mon_programme

# Règle par défaut
all: $(TARGET)

# Lien de l'exécutable
$(TARGET): $(OBJECTS)
    $(CC) -o $@ $^

# Compilation des fichiers .c en .o avec génération des dépendances
%.o: %.c
    $(CC) $(CFLAGS) -MMD -c $< -o $@

# Inclure les fichiers de dépendance
-include $(DEPENDS)

# Déclaration des cibles phony
.PHONY: all clean fclean re

# Nettoyage
clean:
    rm -f $(OBJECTS) $(DEPENDS)

fclean: clean
    rm -f $(TARGET)

re: fclean all
Enter fullscreen mode Exit fullscreen mode

Exemple 2 : Avec une bibliothèque statique

1. Fichier d'en-tête : utils.h

#ifndef UTILS_H
#define UTILS_H

// Fonction pour additionner deux entiers
int addition(int a, int b);

#endif // UTILS_H
Enter fullscreen mode Exit fullscreen mode

2. Fichier source : utils.c

#include "utils.h"

// Implémentation de la fonction d'addition
int addition(int a, int b) {
    return a + b;
}
Enter fullscreen mode Exit fullscreen mode

3. Fichier principal : main.c

#include <stdio.h>
#include "utils.h"

int main() {
    int a = 5;
    int b = 3;
    int result = addition(a, b);

    printf("La somme de %d et %d est : %d\n", a, b, result);
    return 0;
}
Enter fullscreen mode Exit fullscreen mode

4. Makefile : Makefile

# Variables
CC = gcc
AR = ar
CFLAGS = -Wall -g
SOURCES = main.c utils.c
OBJECTS = $(SOURCES:.c=.o)
DEPENDS = $(OBJECTS:.o=.d)
TARGET = mon_programme
LIBRARY = libutils.a

# Règle par défaut
all: $(TARGET)

# Lien de l'exécutable
$(TARGET): $(OBJECTS) $(LIBRARY)
    $(CC) -o $@ $^

# Création de la bibliothèque statique
$(LIBRARY): utils.o
    $(AR) rcs $@ $^

# Compilation des fichiers .c en .o avec génération des dépendances
%.o: %.c
    $(CC) $(CFLAGS) -MMD -c $< -o $@

# Inclure les fichiers de dépendance
-include $(DEPENDS)

# Déclaration des cibles phony
.PHONY: all clean fclean re

# Nettoyage
clean:
    rm -f $(OBJECTS) $(DEPENDS) $(LIBRARY)

fclean: clean
    rm -f $(TARGET)

re: fclean all
Enter fullscreen mode Exit fullscreen mode

Résumé des Exemples

  1. Sans bibliothèque statique :

    • Compile directement les fichiers source pour créer l'exécutable mon_programme sans créer de bibliothèque.
  2. Avec bibliothèque statique :

    • Crée une bibliothèque libutils.a à partir de utils.o.
    • L'exécutable mon_programme dépend de cette bibliothèque.

Utilisation

  • Pour compiler le programme : make
  • Pour nettoyer les fichiers objets et la bibliothèque (dans le premier exemple) : make clean
  • Pour nettoyer complètement : make fclean
  • Pour reconstruire : make re

Ces exemples montrent comment structurer un projet simple avec et sans bibliothèque statique tout en maintenant une clarté et une maintenabilité dans le Makefile.

Exemple 3 : Avec utilisation d'un autre bibliothèque :

Note : c'est le Makefile que j'ai créé lors de la réalisation d'un de mes projets.

# Arguments
NAME        = libftprintf.a
CFLAGS      = -Wall -Wextra -Werror -I .

# Sources
SRC_FILES    = ft_printf.c \
               ft_ulitob.c \
               ft_putunbr_fd.c \
               ft_unsigned_lintlen.c \
               ft_lintlen.c \
               ft_print_c.c \
               ft_print_s.c \
               ft_print_p.c \
               ft_print_di.c \
               ft_print_u.c \
               ft_print_x.c

# Objets
OBJ_FILES    = $(SRC_FILES:.c=.o)

# Règle principale
all: $(NAME)

# Création de la bibliothèque
$(NAME): $(OBJ_FILES)
    make -C libft/
    cp libft/libft.a $(NAME)
    ar rcs $(NAME) $(OBJ_FILES)

# Compilation des fichiers source
%.o: %.c
    $(CC) $(CFLAGS) -c $< -o $@

# Nettoyage
clean:
    rm -rf $(OBJ_FILES)
    make clean -C libft/

fclean: clean
    rm -rf $(NAME)
    make fclean -C libft/

re: fclean all

# Commandes indispensables
.PHONY: all clean fclean re
Enter fullscreen mode Exit fullscreen mode

Améliorations Clés

  1. Génération Automatique des Fichiers Objet : La variable OBJ_FILES convertit automatiquement les noms de fichiers source en noms de fichiers objet à l'aide de la substitution de motifs.

  2. Règles de Motif : L'utilisation de règles de motif (%.o: %.c) simplifie les commandes de compilation pour chaque fichier source.

  3. Règles de Nettoyage Organisées : Les règles de nettoyage sont concises, supprimant les répétitions inutiles.

  4. Facilité de Maintenance : La structure est claire, ce qui rend les futures modifications plus simples.

Ce Makefile conserve la même fonctionnalité tout en étant plus propre et plus efficace.

Image of Datadog

Create and maintain end-to-end frontend tests

Learn best practices on creating frontend tests, testing on-premise apps, integrating tests into your CI/CD pipeline, and using Datadog’s testing tunnel.

Download The Guide

Top comments (0)

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up