ホームページ  >  記事  >  バックエンド開発  >  Makefile - .h - .c の例。

Makefile - .h - .c の例。

王林
王林オリジナル
2024-07-17 07:42:59416ブラウズ

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. メイクファイル: メイクファイル

# 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. メイクファイル: メイクファイル

# 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: 別のライブラリの使用:

注: これは、プロジェクトの 1 つを実行するときに作成した 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。