2017-03-10 11 views
1

私のMakefileが再リンクしていて、なぜそれが見つからないのですか?メイクファイルを再リンクするのを避ける方法

mallocが$(NAME)を実行する必要があると思われる理由はわかりません。 $(SRC:.c = .o)マクロは.oファイルなどのタイムスタンプを変更していますか?

CC    = gcc 
NAME    = app 

# 

CFLAGS   = -Wall -Werror -Wextra -pedantic -pedantic-errors 
INCLUDES   = -I ./includes 

# 

DIRSRC   = srcs/ 
DIROBJ   = objs/ 

SRC    += main.c 
SRC    += malloc.c 

OBJ    = $(SRC:.c=.o) 
DIROBJS   = $(addprefix $(DIROBJ), $(OBJ)) 

# 

LIBS_PATH  = ./libs 

LIBFT_PATH  = $(LIBS_PATH)/libft 
LIBFT_INCLUDES = -I $(LIBFT_PATH) 
LIBFT   = -L $(LIBFT_PATH) -lft 

# 

COMPILE   = $(CC) $(CFLAGS) $(INCLUDES) 

# 

all: $(NAME) 

$(NAME): configure libs $(DIROBJS) 
    $(COMPILE) $(LIBFT) $(DIROBJS) -o $(NAME) 

$(DIROBJ)%.o: $(DIRSRC)%.c 
    @echo Compiling: $< 
    $(COMPILE) $(LIBS_INCLUDES) -c $< -o [email protected] 

clean: 
    @rm -rf $(DIROBJ) 

fclean: clean 
    @rm -rf $(NAME) 

re: fclean all 

# 

configure: 
    @mkdir -p $(DIROBJ) 

# 

libs: 
    @$(MAKE) -C $(LIBS) 

.PHONY: all configure clean fclean re libs cleanlibs fcleanlibs relibs 
+0

このメイクファイルは、$(OBJDIRS)ターゲットが実行される前にconfigureが実行される保証がないため、 '-j'で失敗することがあります。 – blackghost

答えて

1

常にconfigureルールが実行されるため、常に再リンクされます。だから、Makeは依存関係の1つが変わったと信じて、ルールを再評価します。

私はこれを解決する方法はconfigureルールを取り除くことであろうと、あなたのオブジェクトファイルを構築する規則で@mkdir -p $(DIROBJS)を移動するには:

$(DIROBJ)%.o: $(DIRSRC)%.c 
    @mkdir -p $(DIROBJS) 
    @echo Compiling: $< 
    $(COMPILE) $(LIBS_INCLUDES) -c $< -o [email protected] 

(それが関連している可能性が複数の理由があるかもしれませんあなたが建築している図書館にも)、私は知らない。これで完全に解決できるかどうかをお知らせください。

0

@ rturの答えが働いていますが、私は別の方法を述べるべきです。あなたはそうすることができます:

$(DIROBJ): 
    mkdir [email protected] 

$(DIROBJ)/%.o: $(DIRSRC)/%.c | $(DIROBJ) 
    @echo Compiling: $< 
    $(COMPILE) $(LIBS_INCLUDES) -c $< -o [email protected] 

こうすれば、ディレクトリが存在しない場合にのみ作成されます。注目すべきことの1つは|シンボルです。これにより、$(DIROBJ)order-onlyになります。これは、それがターゲットよりも新しい場合、ターゲットが再構築されないことを意味します。ディレクトリのタイムスタンプは、その中の最後の項目が追加/削除/変更された日付であり、ターゲットはそのシンボルなしで常に古くなるため、これはディレクトリにとっては本当に重要です。この方法でmkdirの呼び出しが少ないので、これはよりきれいだと考えられます。

また、スタイルノートとして、通常、ディレクトリ名の末尾に末尾の/を含めないでください。 $(OBJ_DIR)/%.o$(OBJ_DIR)%.oよりもよさそうです。

関連する問題