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

정말 감사합니다. 저는 이 두 라이브러리를 함께 병합할 수 있다고 생각하는 실수를 저질렀습니다. 내가 한 일은 하위 디렉터리에 생성된 개체 파일을 가져와 현재 개체 파일과 함께 사용하여 두 번째 라이브러리를 생성하는 것이었습니다. 지금은 너무 뻔한 것 같은데...

편집: 요청에 따라 내가 한 일을 설명하겠습니다. 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의 내용입니다.

관련 정보