我有以下makefile:
CC=gcc
CFLAGS= ---
LDFLAGS = ---
all: abc_test
abc_test: abc_test.o defn_abc.o abc.o cmocka_compass.o
$(CC) $(LDFLAGS) abc_test.o defn_abc.o abc.o cmocka_compass.o -o
abc_test
abc_test.o : abc_test.c
$(CC) $(CFLAGS) abc_test.c
defn_abc.o : ../defn_abc.c
$(CC) $(CFLAGS) ../defn_abc.c
abc.o : ../abc.c
$(CC) $(CFLAGS) ../abc.c
knownfile.o : ../../../../../knownpath.c
$(CC) $(CFLAGS) ../../../../../knownpath.c
clean:
rm *o *.log abc_test
哪个会起作用(更改了一些文件名),但我想让它变得通用。我尝试了以下但是我一直收到没有目标的错误。
CC=gcc
CFLAGS= ---
LDFLAGS = ---
SRCFILES := $(shell find ../ -name '*.c')
OBJFILES := $(patsubst %.c,%.o,%(SRCFILES))
OBJFILES: all
all: $(OBJFILES)
%.o: %.c
$(CC) $(CFLAGS) %< -o %@
knownfile.o : knownpath.c
$(CC) $(CFLAGS) knownpath.c
make文件是一个测试文件夹,其中包含所有测试代码(abs_test.c)。这也是所有对象应该去的地方。一个目录包含c文件defn_abc.c和abc.c.
知道我做错了吗?
更新:这是我最新的makefile,错误'缺少分隔符'
CC=gcc
CFLAGS=-c -Wall -DUNIT_TESTING -DSYS_LINUX -Ipath1 -Ipath2
LDFLAGS = -Wl,---
SRCFILES := $(shell find ../ -name '*.c')
OBJFILES := $(patsubst %.c,%.o,$(SRCFILES))
all: $(PROG)
$(PROG): $(OBJFILES)
$(CC) $(CFLAGS) $(OBJFILES) -o $@ $(LDFLAGS)
all: $(OBJFILES)
%.o: %.c
$(CC) $(CFLAGS) %< -o %@
knownfile.o : knownpath.c
$(CC) $(CFLAGS) knownfile.c
答案 0 :(得分:1)
此行不符合您的预期:
OBJFILES: all
或者至少我是这么认为的,因为虽然它几乎无害,但它也没用。它声明目标命名为&#39; OBJFILES&#39;取决于目标&#39;全部&#39;。它也恰好是文件中的第一个目标,因此它是默认目标,但因为&#39; all&#39;是它的先决条件,它将导致所有&#39;默认情况下要重建的目标。如果您完全省略该行,这正是会发生的情况。另请注意,这与变量 $(OBJFILES)
无关。
您的主要问题似乎是您对大多数变量引用使用了错误的语法。具有多字符名称的变量的值是通过表达$(VAR)
或${VAR}
, 而非 %(var)
的表达式获得的。对于单字符名称,可以省略括号/大括号。我建议你使用带有括号的表单来支持括号,特别是在配方中的命令,因为后者很容易与shell语法混淆。
答案 1 :(得分:0)
我建议你阅读一下Makefile的基础知识。这是一个有用的链接intro to makefile
在提供的示例中,变量OBJFILES
被覆盖在连续的行中。我怀疑删除行
OBJFILES: all
并使用patsubst作为
$(patsubst %suffix,%replacement,$(var))
可能有帮助。
@edit:从现在开始,您询问了如何使用LDFLAGS
并删除了缺少的分隔符&#39;错误,这里有一些建议。
LDFLAGS
的目的是在链接所有目标文件以生成最终可执行文件时,为编译器提供链接时标志。他们可能看起来像这样all: $(PROG) $(PROG): $(OBJFILES) $(CC) $(CFLAGS) $(OBJFILES) -o $@ $(LDFLAGS)
---->$(CC) $(CFLAGS) $(OBJFILES) -o $@ $(LDFLAGS) ---->$(CC) $(CFLAGS) %< -o %@ ---->$(CC) $(CFLAGS) knownfile.c