首頁 >後端開發 >C++ >Makefile - .h - .c 範例。

Makefile - .h - .c 範例。

王林
王林原創
2024-07-17 07:42:59487瀏覽

Makefile - .h - .c exemple.

這是專案結構,首先是沒有靜態函式庫的範例,然後是帶有靜態函式庫的範例。

專案結構

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

範例1:沒有靜態庫

1.頭檔:utils.h

#ifndef UTILS_H
#define UTILS_H

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

#endif // UTILS_H

2.原始檔:utils.c

#include "utils.h"

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

3.主檔案: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

# 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

範例 2:使用靜態函式庫

1.頭檔:utils.h

#ifndef UTILS_H
#define UTILS_H

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

#endif // UTILS_H

2.原始檔:utils.c

#include "utils.h"

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

3.主檔案: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

# 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

例子總結

  1. 沒有靜態庫:

    • 直接編譯原始檔以建立 my_program 執行文件,無需建立庫。
  2. 使用靜態庫:

    • 從 utils.o 建立 libutils.a 函式庫。
    • my_program 執行檔依賴於該程式庫。

使用

  • 編譯程式:make
  • 清理目標檔案和函式庫(在第一個範例中):make clean
  • 徹底清理:make fclean
  • 重建:make re

這些範例顯示如何在使用和不使用靜態函式庫的情況下建構一個簡單的項目,同時保持 Makefile 的清晰度和可維護性。

範例 3:使用另一個庫:

注意:這是我執行一個專案時所建立的 Makefile。

# 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

主要改進

  1. 自動產生目標檔案:OBJ_FILES 變數使用模式取代會自動將來源檔案名稱轉換為目標檔案名稱。

  2. 模式規則:使用模式規則(%.o:%c)簡化每個原始檔的編譯指令。

  3. 有組織的清潔規則:清潔規則簡潔,消除不必要的重複。

  4. 易於維護:結構清晰,方便日後修改。

這個 Makefile 保持了相同的功能,同時更乾淨、更有效率。

以上是Makefile - .h - .c 範例。的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn