简体   繁体   English

用makefile编译多个.c文件

[英]Compile multiple .c files with makefile

I would like to compile multiple .c files at once using a makefile. 我想使用一个makefile一次编译多个.c文件。 I already made this: 我已经做了这个:

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 $^

I have no Idea why this does not work("nothing to be done for "all"). Someone has an idea? 我不知道为什么这行不通(“什么都做不了”。有人有想法吗?

This line is creating a circular dependency: 这行正在创建循环依赖项:

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

Try replacing it with this: 尝试将其替换为:

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

You forgot -o $@ in your 'sources to objects' rule. 您在“对象来源”规则中忘记了-o $@ Thus it doesn't create anything. 因此,它不会创建任何东西。

You have also spelling error - your $(TARGET) is 'test', but your 'all' rule depends on $(TAREGT) which is empty. 您也有拼写错误- $(TARGET)是'test',但是'all'规则取决于$(TAREGT)为空。 You are also using $(TAREGT) as input to compile 'test'. 您还使用$(TAREGT)作为编译“测试”的输入。

You don't need to specify $(SOURCES) or "sources to objects" rule - implicit rules will do the trick. 您无需指定$(SOURCES)或“对象的源”规则-隐式规则可以解决问题。

In fact your "sources to objects" rule is incorrect - it says that each object depends on all sources. 实际上,您的“对象来源”规则是错误的-它表示每个对象都依赖于所有来源。 If you want each object to depend on one source you should use either suffix rule, pattern rule or static pattern rule. 如果希望每个对象都依赖一个源,则应使用后缀规则,模式规则或静态模式规则。 Or just implicit rule. 或者只是隐式规则。

$(OBJECTS) : $(SOURCES) 

The above tells Make that every .o file depends on all sources, ie if you change one of your .c files Make will recompile all .o files. 上面的内容告诉Make,每个.o文件都依赖于所有源,即,如果更改其中一个.c文件,则Make将重新编译所有.o文件。 Not something what you really want, I guess. 我想这不是您真正想要的东西。 I'd rework this rule as follows: 我将按如下方式修改此规则:

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

This will iterate every source in SOURCES , find corresponding .o file in OBJECTS and create correct rule: <obj>: <source> . 这将迭代SOURCES每个源,在OBJECTS找到相应的.o文件,并创建正确的规则: <obj>: <source> It is that complicated to work in case of more complex mapping between source and object files. 如果源文件和目标文件之间的映射更加复杂,那么工作就很复杂。 Say, when building object files in separate directory. 说,当在单独的目录中构建目标文件时。

This cryptic code will work even for the following weird source to object file mapping: 该加密代码甚至适用于以下奇怪的源到目标文件映射:

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))

It will generate the following rules: 它将生成以下规则:

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

Thank you guys for you help, it is working now 谢谢大家的帮助,它现在正在工作

I just added some rules: 我刚刚添加了一些规则:

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