>백엔드 개발 >C++ >Makefile - .h - .c 예.

Makefile - .h - .c 예.

王林
王林원래의
2024-07-17 07:42:59454검색

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
  • 완전히 정리하려면: 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으로 문의하세요.