다음은 먼저 정적 라이브러리가 없는 예제와 정적 라이브러리가 있는 예제가 있는 프로젝트 구조입니다.
/mon_projet ├── Makefile ├── utils.h ├── utils.c └── main.c
#ifndef UTILS_H #define UTILS_H // Fonction pour additionner deux entiers int addition(int a, int b); #endif // UTILS_H
#include "utils.h" // Implémentation de la fonction d'addition int addition(int a, int b) { return a + b; }
#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; }
# 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
#ifndef UTILS_H #define UTILS_H // Fonction pour additionner deux entiers int addition(int a, int b); #endif // UTILS_H
#include "utils.h" // Implémentation de la fonction d'addition int addition(int a, int b) { return a + b; }
#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; }
# 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
정적 라이브러리 없음:
정적 라이브러리 사용:
이 예는 Makefile에서 명확성과 유지 관리성을 유지하면서 정적 라이브러리가 있거나 없는 간단한 프로젝트를 구성하는 방법을 보여줍니다.
참고: 이것은 제가 프로젝트를 수행할 때 만든 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
객체 파일 자동 생성: OBJ_FILES 변수는 패턴 대체를 사용하여 소스 파일 이름을 객체 파일 이름으로 자동 변환합니다.
패턴 규칙: 패턴 규칙(%.o:%c)을 사용하면 각 소스 파일에 대한 컴파일 명령이 단순화됩니다.
정리된 청소 규칙: 청소 규칙은 간결하여 불필요한 반복을 제거합니다.
유지보수 용이성: 구조가 명확하여 향후 수정이 더 간단합니다.
이 Makefile은 동일한 기능을 유지하면서도 더 깔끔하고 효율적입니다.
위 내용은 Makefile - .h - .c 예.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!