c++ - 如何根据我提供的参数创建动态 make?

标签 c++ makefile

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

说到点子上。我创建了一个这样的目录结构:

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

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

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

make 1

这将从 src/1.cpp 编译 bin/1obj/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/

相关文章:

linux - 在多核或分布式系统上编译程序

java - Java 使用哪个版本的 Make?

c - GTK3.0项目移植到GTK2.0

c++ - C++ 中表达式必须具有常量值

c++ - 我可以在 OpenGL (C++) 的缓冲区中混合数据类型吗?

c++ - "hidden overloaded virtual function"超过 2 个类

shell - 'yes n' 在这个 make 文件中做了什么

perl - 如何使用 Makefile.PL 和 ExtUtils::MakeMaker 复制文件?

c++ - 消除 C++ 数组中最后一项后的逗号

android - 将 MuPDF 集成为库项目 (Android)