繁体   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