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.

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay