簡體   English   中英

用makefile編譯多個.c文件

[英]Compile multiple .c files with makefile

我想使用一個makefile一次編譯多個.c文件。 我已經做了這個:

CC= gcc

CPPFLAGS = -I.

CFLAGS = -W -Wall -ansi -pedantic

TARGET = test

RM = rm

OBJECTS = xxx.o yyy.o zzz.o

SOURCES = $(OBJECTS:.o =.c)

.PHONY: all clean

all: $(TAREGT)

clean:

         $(RM) $(TARGET) $(OBJECTS)

$(TAREGT) : $(OBJECTS)

         $(CC) $^ -o $@

$(OBJECTS) : $(SOURCES) 

         $(CC) $(CFLAGS) $(CPPFLAGS) -c $^

我不知道為什么這行不通(“什么都做不了”。有人有想法嗎?

這行正在創建循環依賴項:

SOURCES = $(OBJECTS:.o =.c)

嘗試將其替換為:

SOURCES = $(patsubst %.o,%.c,$(OBJECTS))

您在“對象來源”規則中忘記了-o $@ 因此,它不會創建任何東西。

您也有拼寫錯誤- $(TARGET)是'test',但是'all'規則取決於$(TAREGT)為空。 您還使用$(TAREGT)作為編譯“測試”的輸入。

您無需指定$(SOURCES)或“對象的源”規則-隱式規則可以解決問題。

實際上,您的“對象來源”規則是錯誤的-它表示每個對象都依賴於所有來源。 如果希望每個對象都依賴一個源,則應使用后綴規則,模式規則或靜態模式規則。 或者只是隱式規則。

$(OBJECTS) : $(SOURCES) 

上面的內容告訴Make,每個.o文件都依賴於所有源,即,如果更改其中一個.c文件,則Make將重新編譯所有.o文件。 我想這不是您真正想要的東西。 我將按如下方式修改此規則:

$(foreach s,$(SOURCES),$(eval $(filter %$(basename $(notdir $s)).o,$(OBJECTS)): $s))

這將迭代SOURCES每個源,在OBJECTS找到相應的.o文件,並創建正確的規則: <obj>: <source> 如果源文件和目標文件之間的映射更加復雜,那么工作就很復雜。 說,當在單獨的目錄中構建目標文件時。

該加密代碼甚至適用於以下奇怪的源到目標文件映射:

SOURCES := a.cpp boo/b.c c.C
OBJECTS := foo/a.o bar/b.o c.o
$(foreach s,$(SOURCES),$(eval $(filter %$(basename $(notdir $s)).o,$(OBJECTS)): $s))

它將生成以下規則:

foo/a.o: a.cpp
bar/b.o: boo/b.c
c.o: c.C

謝謝大家的幫助,它現在正在工作

我剛剛添加了一些規則:

CC= gcc
CPPFLAGS = -I.
CFLAGS = -W -Wall -ansi -pedantic
TARGET = test
RM = rm
SOURCES = xxx.c yyy.c zzz.c
OBJECTS = $(SOURCES:.c=.o)

.PHONY: all clean

all: $(TARGET)

clean:
    $(RM) $(TARGET) $(OBJECTS)

$(TARGET) : $(OBJECTS)
    $(CC) $^ -o $@

%.o: %.c
    $(CC) $(CFLAGS) $(CPPFLAGS) -c $<

暫無
暫無

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

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