这是项目结构,首先是没有静态库的示例,然后是带有静态库的示例。
/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中文网其他相关文章!