创建更通用的makefile

时间:2018-05-30 14:32:16

标签: c generics makefile

我有以下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

2 个答案:

答案 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)
  • 错误&#39; 缺少分隔符&#39;通过在描述规则的动作/配方的行的开头插入制表符而不是空格来修复。在编辑器中再次打开Makefile并删除下面行前面的空格并替换为tab ..我用来显示选项卡的箭头
---->$(CC) $(CFLAGS) $(OBJFILES) -o $@ $(LDFLAGS)

---->$(CC) $(CFLAGS) %< -o %@

---->$(CC) $(CFLAGS) knownfile.c