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