이전에 만든 다른 라이브러리가 포함된 새 라이브러리를 생성하려고 합니다.
현재 폴더에서 소스 파일은 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
정말 감사합니다. 저는 이 두 라이브러리를 함께 병합할 수 있다고 생각하는 실수를 저질렀습니다. 내가 한 일은 하위 디렉터리에 생성된 개체 파일을 가져와 현재 개체 파일과 함께 사용하여 두 번째 라이브러리를 생성하는 것이었습니다. 지금은 너무 뻔한 것 같은데...
편집: 요청에 따라 내가 한 일을 설명하겠습니다. secondlibrary.a를 사용할 수 없으며 기본 라이브러리.a와 병합할 수 없습니다.
지금은 보조 라이브러리.a를 만들기 전에 해당 폴더의 모든 .c 파일에서 모든 개체 파일을 생성하는 lib 폴더에 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
이제 내 mainlibrary.a인 $(NAME)은 현재 디렉터리의 개체 파일과 내 하위 디렉터리의 개체 파일에 따라 달라집니다. "$(SUBDIR)/libft.a"(mysecondarylibrary.a)는 실제로 생성할 필요는 없지만 과제에 필요한 요구 사항이므로 그대로 두었으므로 활용도 가능했습니다. 이 하위 디렉터리에 이미 있는 makefile의 내용입니다.