我正在尝试生成一个新库,其中包含我之前创建的另一个库。
在我当前的文件夹中,我的源文件位于 src 文件夹内,标头位于 include 文件夹内。
这是我到目前为止所做的:
NAME := mainlibrary.a
SRCS := $(wildcard src/*.c)
OBJS := $(SRCS:.c=.o) $(wildcard lib/*.o)
S_LIB := lib/secondarylibrary.a
CC := gcc
CFLAGS := -Wall -Wextra -Werror -Iinclude -Ilib
RM := rm -f
MAKEFLAGS := --no-print-directory
all: $(S_LIB) $(NAME)
$(NAME): $(OBJS) $(S_LIB)
ar rcs $(NAME) $(OBJS) $(S_LIB)
$(S_LIB):
$(MAKE) -C lib
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
$(RM) $(OBJS) $(wildcard lib/*.o)
fclean: clean
$(RM) $(NAME) $(S_LIB)
re:
$(MAKE) fclean
$(MAKE) all
.PHONY: all bonus clean fclean re
现在,当我尝试用以下命令编译我的程序时
gcc main.c -L. -lmainlibrary.a -Iinclude -Ilib.
除非我指定辅助库,否则我无法做到这一点,这违背了整个目的,因为我试图将该库已经放在我的主库中。
谢谢你的帮助。
答案1
非常感谢大家,我确实错误地认为我可以将这两个库合并在一起。我所做的是获取子目录中生成的目标文件,并将它们与我当前的目标文件一起使用来生成第二个库。现在看来是那么明显……
编辑:根据要求,我将解释我做了什么:我不能使用 secondarylibrary.a 并将其与 main library.a 合并
现在,我在 lib 文件夹中有一个 makefile,它在创建 secondarylibrary.a 之前从该文件夹中的所有 .c 文件中生成所有目标文件。
我的 makefile 中的这一行: $(S_LIB): $(MAKE) -C lib
基本上就是说,进入 lib 文件夹并使用“make”命令来激活该 makefile。
由于我已经在该文件夹中生成了所有目标文件,因此我需要的只是将这些文件与我用于 mainlibrary.a 的文件一起使用
我更改了之前发布的 makefile:
NAME := libftprintf.a
SUBDIR := libft
SRCDIR := src
INCDIR := include
SRCS := $(wildcard $(SRCDIR)/*.c)
OBJS := $(SRCS:$(SRCDIR)/%.c=%.o)
INCLUDES := -I$(INCDIR) -Ilibft
CC := clang
CFLAGS := -Wall -Wextra -Werror $(INCLUDES)
RM := rm -f
MAKEFLAGS := --no-print-directory
all: $(NAME)
$(NAME): $(OBJS) $(SUBDIR)/libft.a
ar rcs $(NAME) $(OBJS) $(wildcard $(SUBDIR)/*.o)
$(SUBDIR)/libft.a:
$(MAKE) -C $(SUBDIR)
%.o: $(SRCDIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
$(RM) $(OBJS)
$(MAKE) -C $(SUBDIR) clean
fclean:
$(RM) $(NAME) $(OBJS)
$(MAKE) -C $(SUBDIR) fclean
re:
$(MAKE) fclean
$(MAKE) all
.PHONY: all clean fclean re $(SUBDIR)/libft.a
现在 $(NAME) 这是我的 mainlibrary.a 取决于当前目录中的对象文件和我的子目录中的对象文件。请记住,“$(SUBDIR)/libft.a”(我的 secondarylibrary.a) 并不是真正需要创建的,但这是我的作业的要求,所以我把它留在那里,这也让我能够利用已经位于该子目录中的 makefile 的内容。