簡體   English   中英

帶有多個文件的Makefile始終可以構建所有內容

[英]Makefile with multiple files always builds everything

我正在編寫一個Makefile,它可以編譯許多C文件,有些C文件與Makefile位於同一目錄中,而另一些位於父目錄中(出於歷史原因,必須存在)。 我想將所有* .o文件放在一個目錄中(在我的情況下為objdir)。 這似乎可行,但是由於某種原因,即使沒有任何更改,此Makefile也會始終構建所有內容。 我的規則/依賴性在哪里出錯?

更新:我已經將我的Makefile和源代碼精簡到最低限度(請參見下面的源文件內容。要清楚,這確實可以編譯和鏈接。問題是,每次我運行make時,它都會進行編譯和鏈接,甚至如果沒有任何變化,這不是典型的make行為。

Makefile內容:

CC = gcc
CFLAGS = -g -Wall -Werror -I..
SRCS = main.c ../a.c
OBJS = $(patsubst %.c, objdir/%.o, $(SRCS))
LN_OBJS = $(patsubst %.c, objdir/%.o, $(notdir $(SRCS)))
MAIN = foo

.PHONY: clean

default: objdir $(MAIN)
    @echo  Done

$(MAIN): $(OBJS) 
    $(CC) $(CFLAGS) -o $(MAIN) $(LN_OBJS    )

objdir/%.o: %.c
    $(CC) $(CFLAGS) -c $< -o objdir/$(notdir $@)

objdir:
    @mkdir -p objdir

clean:
    @$(RM) -rf objdir $(FDP) $(DK)

main.c內容

#include "stdlib.h"
#include "stdio.h"

#include "a.h"

int main(int argc, char**argv)
{
    printf("Hello\n");
    a();
}

../ac內容

#include <stdio.h>

void a()
{
    printf("Hi from a\n");
}

../ah內容

#ifndef __a__
#define __a__

void a();

#endif

您的objdir/%.o:規則已擴展為objdir/../ao: ../ac ,但隨后您創建了objdir/$(notdir $@) ,這違反了Makefiles規則中的規則2。

解決此問題的一種方法是使用vpath (還請注意, objdir應該是對象的(僅訂購)依賴項):

SRCS = main.c a.c
vpath %.c ../
# [...]
objdir/%.o: %.c | objdir
    $(CC) $(CFLAGS) -c $< -o $@

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM