Makefile无法引入头文件libft.h,编译提示文件不存在如何解决?
问题排查
你遇到的报错由多个配置错误共同导致:
-I参数使用错误:-I后需要跟头文件的存放目录,而非具体头文件路径。你当前配置-I $(HDR)指向的是includes/libft.h文件,编译器无法通过该路径搜索头文件。- 目标文件路径与编译规则不匹配:你定义了将.o文件生成到
obj/目录的模式规则,但实际目标文件变量SRC_PATH_O指向的是src/目录下的.o文件,make无法匹配到自定义规则,只能调用默认隐式规则编译,而默认规则没有携带-I参数,因此找不到头文件。 - 细节配置错误:
- 生成静态库的命令中使用
$<只会引入第一个目标文件,最终生成的libft.a只会包含第一个函数,需要替换为$^引入所有依赖的.o文件 SRC_FILES中存在拼写错误:ft_isalmun.c应为ft_isalnum.c- 模式规则中的头文件依赖未写全路径,修改
libft.h不会触发代码重编译
- 生成静态库的命令中使用
修正后的Makefile
NAME=libft.a LIBSO=libft.so CC=gcc CFLAGS=-Wall -Wextra -Werror SRC_DIR=src/ BONUS_DIR=lst/ OBJ_DIR=obj/ HDR_DIR=includes/ SRC_FILES= ft_bzero.c \ ft_isalnum.c \ ft_isalpha.c \ ft_isascii.c \ ft_isdigit.c \ ft_isprint.c \ ft_memchr.c \ ft_memcpy.c \ ft_memmove.c \ ft_memset.c \ ft_strchr.c \ ft_strlcat.c \ ft_strlcpy.c \ ft_strlen.c \ ft_strncmp.c \ ft_strrchr.c \ ft_tolower.c \ ft_toupper.c BONUS_FILES=ft_lstadd_back.c \ ft_lstadd_front.c \ ft_lstdelone.c \ ft_lstclear.c \ ft_lstiter.c \ ft_lstlast.c \ ft_lstmap.c \ ft_lstnew.c \ ft_lstsize.c # 统一将.o文件生成到obj目录下 SRC_OBJ=$(addprefix $(OBJ_DIR), $(SRC_FILES:.c=.o)) BONUS_OBJ=$(addprefix $(OBJ_DIR), $(BONUS_FILES:.c=.o)) HDR=$(HDR_DIR)libft.h all: $(NAME) $(NAME): $(SRC_OBJ) ar rc $@ $^ ranlib $@ # bonus规则,编译链表相关函数 bonus: $(SRC_OBJ) $(BONUS_OBJ) ar rc $(NAME) $^ ranlib $(NAME) # 确保obj目录存在,order-only依赖避免目录修改时间变化触发全量重编 $(OBJ_DIR): mkdir -p $@ $(OBJ_DIR)%.o: $(SRC_DIR)%.c $(HDR) | $(OBJ_DIR) $(CC) $(CFLAGS) -c $< -o $@ -I $(HDR_DIR) $(OBJ_DIR)%.o: $(BONUS_DIR)%.c $(HDR) | $(OBJ_DIR) $(CC) $(CFLAGS) -c $< -o $@ -I $(HDR_DIR) clean: rm -rf $(OBJ_DIR) fclean: clean rm -f $(NAME) $(LIBSO) re: fclean all .PHONY: all clean fclean re bonus
验证说明
执行make即可正常编译生成静态库,执行make bonus可以将链表相关的bonus函数也打包进libft.a中。
内容的提问来源于stack exchange,提问作者MiguelP
相关产品推荐
相关产品推荐

