Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Makefile - .h - .c contoh.

Makefile - .h - .c contoh.

王林
王林asal
2024-07-17 07:42:59416semak imbas

Makefile - .h - .c exemple.

Berikut ialah struktur projek dengan contoh tanpa perpustakaan statik dahulu, diikuti dengan contoh dengan perpustakaan statik.

Struktur Projek

/mon_projet
├── Makefile
├── utils.h
├── utils.c
└── main.c

Contoh 1: Tanpa perpustakaan statik

1. Fail pengepala: utils.h

#ifndef UTILS_H
#define UTILS_H

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

#endif // UTILS_H

2. Fail sumber: utils.c

#include "utils.h"

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

3. Fail utama: 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;
}

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

Contoh 2: Dengan perpustakaan statik

1. Fail pengepala: utils.h

#ifndef UTILS_H
#define UTILS_H

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

#endif // UTILS_H

2. Fail sumber: utils.c

#include "utils.h"

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

3. Fail utama: 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;
}

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

Ringkasan Contoh

  1. Tanpa perpustakaan statik:

    • Kompilasi fail sumber secara langsung untuk mencipta my_program boleh laku tanpa membuat perpustakaan.
  2. Dengan perpustakaan statik:

    • Mencipta libutils.a library daripada utils.o.
    • Program_my boleh laku bergantung pada perpustakaan ini.

guna

  • Untuk menyusun atur cara: buat
  • Untuk membersihkan fail objek dan pustaka (dalam contoh pertama): buat bersih
  • Untuk membersihkan sepenuhnya: buat fclean
  • Untuk membina semula: buat semula

Contoh ini menunjukkan cara menstruktur projek ringkas dengan dan tanpa perpustakaan statik sambil mengekalkan kejelasan dan kebolehselenggaraan dalam Makefile.

Contoh 3: Menggunakan perpustakaan lain:

Nota: ini ialah Makefile yang saya buat semasa menjalankan salah satu projek saya.

# 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

Penambahbaikan Utama

  1. Penjanaan Automatik Fail Objek: Pembolehubah OBJ_FILES secara automatik menukar nama fail sumber kepada nama fail objek menggunakan penggantian corak.

  2. Peraturan Corak: Menggunakan peraturan corak (%.o:%c) memudahkan arahan kompilasi untuk setiap fail sumber.

  3. Peraturan Pembersihan Tersusun: Peraturan pembersihan adalah ringkas, menghilangkan pengulangan yang tidak perlu.

  4. Kemudahan Penyelenggaraan: Strukturnya jelas, menjadikan pengubahsuaian masa hadapan lebih mudah.

Fail Make ini mengekalkan fungsi yang sama sambil menjadi lebih bersih dan lebih cekap.

Atas ialah kandungan terperinci Makefile - .h - .c contoh.. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn