如何将libft项目的.c文件编译到obj目录?Makefile配置求助
解决libft Makefile将.o文件编译到obj目录的问题
你遇到的make: *** No rule to make target 'mkdir', needed by 'libft.a'. Stop.错误,是因为把shell命令mkdir当成了make的依赖目标,make会尝试寻找名为mkdir的文件或构建规则,自然找不到就报错了。
下面是正确的配置思路和完整Makefile示例:
核心配置要点
- 单独定义
obj目录变量,并写创建目录的规则,让make自动检查目录状态,不存在则创建 - 将所有
.o文件的路径映射到obj目录下 - 编写针对
obj目录下.o文件的编译规则
完整示例Makefile
# 基础变量定义 NAME = libft.a CC = gcc CFLAGS = -Wall -Wextra -Werror OBJ_DIR = obj # 替换所有.c文件路径为obj/.o格式(替换成你实际的.c文件列表) SRCS = ft_strlen.c ft_strcpy.c ft_strdup.c ft_isalpha.c OBJS = $(addprefix $(OBJ_DIR)/, $(SRCS:.c=.o)) # 创建obj目录的规则 $(OBJ_DIR): mkdir -p $(OBJ_DIR) # 编译obj目录下的.o文件 $(OBJ_DIR)/%.o: %.c $(CC) $(CFLAGS) -c $< -o $@ # 构建静态库 $(NAME): $(OBJ_DIR) $(OBJS) ar rcs $(NAME) $(OBJS) # 清理规则 clean: rm -rf $(OBJ_DIR) fclean: clean rm -f $(NAME) re: fclean $(NAME) # 标记伪目标,避免与同名文件冲突 .PHONY: clean fclean re
关键部分解释
$(OBJ_DIR)规则:单独作为一个目标,mkdir -p确保目录不存在时创建,存在时不会报错$(OBJ_DIR)/%.o: %.c规则:匹配所有.c文件,编译后输出到obj目录对应的.o文件,$<代表依赖的.c文件,$@代表目标.o文件$(NAME)的依赖:把$(OBJ_DIR)作为依赖,确保编译.o文件前目录已经存在.PHONY:标记clean、fclean、re为伪目标,避免和同名文件冲突
这样配置后,所有.o文件都会生成在obj目录下,不会污染主目录,也不会出现之前的mkdir错误。
内容的提问来源于stack exchange,提问作者nokosse
相关产品推荐
相关产品推荐

