[英]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.