C 程序 Makefile 帮助

C 程序 Makefile 帮助

我正在尝试生成一个新库,其中包含我之前创建的另一个库。

在我当前的文件夹中,我的源文件位于 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 的内容。

相关内容