首页 > 解决方案 > 创建更通用的 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。

知道我做错了什么吗?


更新:这是我最新的生成文件,错误“缺少分隔符”

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

标签: cgenericsmakefile

解决方案


这条线没有做你认为它做的事情:

OBJFILES: all

或者至少我是这么认为的,因为虽然它大多是无害的,但它也是无用的。它声明名为“OBJFILES”的目标依赖于目标“all”。它也恰好是文件中的第一个目标,所以它是默认目标,但是因为 'all' 是它的先决条件,它会导致默认重建 'all' 目标。如果您完全省略该行,这正是会发生的情况。还要注意,这与变量 无关$(OBJFILES)

您的主要问题似乎是您对大多数变量引用使用了错误的语法。具有多字符名称的变量的值是通过$(VAR)or ${VAR}, not %(var)形式的表达式获得的。单字符名称可以省略括号/大括号。我建议你更喜欢带括号的形式而不是带花括号的形式,尤其是在食谱中的命令中,因为后者很容易与 shell 语法混淆。


推荐阅读