gpt4 book ai didi

c - Makefile - 在不进行任何更改的情况下编译库和可执行文件

转载 作者:行者123 更新时间:2023-11-30 14:58:01 25 4
gpt4 key购买 nike

所以,我可以理解这里的问题是什么,但我不太清楚如何修复它 - 因为它是从不同的目录编译文件,但将 .a 库文件和可执行文件扔到根目录中...似乎 makefile 期望它们位于源目录中,这就是为什么即使没有进行任何更改,它每次都会重建。

问题是,我的学校对文件夹结构非常严格,所以需要准确地编译它,我只需要弄清楚如何让makefile知道可执行文件和库文件确实存在于根目录中。

这是我的 Makefile:

NAME = fillit
LIB = libft.a

CC = gcc
CFLAGS = -Wall -Wextra -Werror
RM = /bin/rm -rf

SRC = main.c validation.c create_piece.c game_board.c solver.c tables.c \
trimmer.c

LIBSRC = ft_putchar.c ft_putstr.c ft_strcpy.c ft_strnew.c ft_strdel.c \
ft_strequ.c ft_putendl.c ft_error.c

LIBLIST := $(shell ls -1 libft | grep .c$$)
LIBOBJ := $(LIBLIST:.c=.o)
LIBOBJ := $(addprefix libft/, $(LIBOBJ))

SRCLIST := $(shell ls -1 src | grep .c$$)
SRCOBJ := $(SRCLIST:.c=.o)
SRCOBJ := $(addprefix src/, $(SRCOBJ))

.PHONY: all $(NAME) lib

all: $(NAME)

libft/%.o: libft/%.c
$(CC) $(CFLAGS) -c -o $@ $<

src/%.o: src/%.c
$(CC) $(CFLAGS) -c -o $@ $<

lib:
ar rc $(LIB) $(LIBOBJ)
ranlib $(LIB)

debug:
$(CC) $(CFLAGS) $(addprefix libft/, $(LIBLIST)) $(addprefix src/, $(SRCLIST)) -g -o fillit

$(NAME): $(LIBOBJ) $(SRCOBJ) lib
$(CC) $(CFLAGS) $(SRCOBJ) -L. -lft -o fillit

clean:
$(RM) $(SRCOBJ)
$(RM) $(LIBOBJ)


fclean: clean
$(RM) $(NAME)
$(RM) $(LIB)

re: fclean all

re-db: fclean debug

编译 .o 文件工作正常,它只执行一次,但如果我继续输入 make,它仍然会编译这部分:

➜  fillit git:(master) ✗ make
ar rc libft.a libft/ft_memset.o libft/ft_putchar.o libft/ft_putendl.o libft/ft_putstr.o libft/ft_strcpy.o libft/ft_strdel.o libft/ft_strequ.o libft/ft_strnew.o
ranlib libft.a
gcc -Wall -Wextra -Werror src/create_piece.o src/game_board.o src/main.o src/solver.o src/tables.o src/trimmer.o src/validation.o -L. -lft -o fillit

最佳答案

要感谢 kaylum 为我指明了正确的方向,我已经找到了解决这个问题的方法。我将 lib 更改为 $(LIB) 并从虚假列表中删除了 $(NAME) 和 lib。工作生成文件:

NAME = fillit
LIB = libft.a

CC = gcc
CFLAGS = -Wall -Wextra -Werror
RM = /bin/rm -rf

SRC = main.c validation.c create_piece.c game_board.c solver.c tables.c \
trimmer.c

LIBSRC = ft_putchar.c ft_putstr.c ft_strcpy.c ft_strnew.c ft_strdel.c \
ft_strequ.c ft_putendl.c ft_error.c

LIBLIST := $(shell ls -1 libft | grep .c$$)
LIBOBJ := $(LIBLIST:.c=.o)
LIBOBJ := $(addprefix libft/, $(LIBOBJ))

SRCLIST := $(shell ls -1 src | grep .c$$)
SRCOBJ := $(SRCLIST:.c=.o)
SRCOBJ := $(addprefix src/, $(SRCOBJ))

.PHONY: all

all: $(NAME)

libft/%.o: libft/%.c
$(CC) $(CFLAGS) -c -o $@ $<

src/%.o: src/%.c
$(CC) $(CFLAGS) -c -o $@ $<

$(LIB):
ar rc $(LIB) $(LIBOBJ)
ranlib $(LIB)

debug:
$(CC) $(CFLAGS) $(addprefix libft/, $(LIBLIST)) $(addprefix src/, $(SRCLIST)) -g -o fillit

$(NAME): $(LIBOBJ) $(SRCOBJ) $(LIB)
$(CC) $(CFLAGS) $(SRCOBJ) -L. -lft -o $(NAME)

clean:
$(RM) $(SRCOBJ)
$(RM) $(LIBOBJ)


fclean: clean
$(RM) $(NAME)
$(RM) $(LIB)

re: fclean all

re-db: fclean debug

关于c - Makefile - 在不进行任何更改的情况下编译库和可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43529773/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com