如何根据我给出的参数创建动态制作?

时间:2014-05-13 23:32:18

标签: c++ makefile

不幸的是,这是一个非常简单的问题,但我似乎无法找到答案。我刚刚回到c ++编程中,并且想通过一些项目的问题重新训练我的生锈技能。我计划今晚快速完成前10个,但在我开始使用makefile之前遇到了一个问题(我知道有些尴尬)。

重点。我创建了一个像这样的目录结构:

 ✗ tree
.
├── bin
├── inc
├── Makefile
├── obj
└── src
    └── 1.cpp

我的想法是我会在src中创建一堆单独的文件并将它们编译为bin,但我一直无法弄清楚如何做到这一点。 (makefile是不适合的?我认为这就足够了。)

我以为我可以用这样的语法来调用它:

make 1

可以从bin/1编译obj/1.osrc/1.cpp

到目前为止我的尝试是这样的:

CC=gcc
CFLAGS=-Wall -g -std=c11
OBJDIR=obj
SRCDIR=src
BINDIR=bin

$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
        $(CC) -c -o $@ $< $(CFLAGS)


clean:
        rm -f $(BINDIR)/* $(OBJDIR)/*

但结果是:

✗ make 1
make: *** No rule to make target '1'.  Stop.

我觉得我错过了一些显而易见的东西,并且很想诉诸一个bash脚本,但感觉就像作弊而没有使用正确的工具来完成工作。我猜测问题是我想在不同的文件上调用Make。

1 个答案:

答案 0 :(得分:3)

您需要另一条规则来构建二进制文件:

$(BINDIR)/%: $(OBJDIR)/%.o
        $(CC) -o $@ $< $(CFLAGS) # you don't actually need that line!

然后是一条捷径:

TARGETS=$(patsubst $(SRCDIR)/%.cpp,%,$(wildcard $(SRCDIR)/*.cpp))

$(TARGETS): %: $(BINDIR)/%
.PHONY: $(TARGETS)

允许您说make 1而不是make bin/1