不幸的是,这是一个非常简单的问题,但我似乎找不到答案。我刚刚回到 C++ 编程,我想我会用一些项目欧拉问题来重新训练我生疏的技能。我计划今晚快速完成前 10 个,但在我开始使用 makefile
之前遇到了问题(我知道这有点尴尬)。
说到点子上。我创建了一个这样的目录结构:
✗ tree
.
├── bin
├── inc
├── Makefile
├── obj
└── src
└── 1.cpp
我的想法是我会在 src
中创建一堆单独的文件并将它们编译到 bin
但我一直无法弄清楚该怎么做。 (makefile 不适合这个吗?我认为这就足够了)。
我想我可以用这样的语法调用它:
make 1
这将从 src/1.cpp
编译 bin/1
和 obj/1.o
。
到目前为止我的尝试是这样的:
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。
最佳答案
您需要另一个规则来构建二进制文件:
$(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
。
关于c++ - 如何根据我提供的参数创建动态 make?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23643283/