c++ - Makefile 总是编译某些文件

标签 c++ makefile

我已经为我的 Project Euler 解决方案目录创建了一个 Makefile,但我在不断重新编译一些解决方案时遇到了一些问题,无论是否缺少更改。此外,为这些重新编译创建的 *.o 文件不会在我为目标文件指定的目录中创建。

我的 Makefile 的一般要点:

CC = g++-5
CFLAGS = -Wall -c
LFLAGS = -Wall
STD = -std=c++14

all: firsttwenty secondtwenty

firsttwenty: p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 p18 p19 p20
secondtwenty: p21 p22 p23 p24 p25

#
# FIRST TWENTY
#
p1: object_files/problem1.o
    $(CC) $(LFLAGS) object_files/problem1.o -o p1 $(STD)

object_files/problem1.o: solutions/problem1.cpp
    $(CC) $(CFLAGS) solutions/problem1.cpp $(STD)

p2: object_files/problem2.o
    $(CC) $(LFLAGS) object_files/problem2.o -o p2 $(STD)

object_files/problem2.o: solutions/problem2.cpp
    $(CC) $(CFLAGS) solutions/problem2.cpp $(STD)

p3: object_files/problem3.o
    $(CC) $(LFLAGS) object_files/problem3.o -o p3 $(STD)

object_files/problem3.o: solutions/problem3.cpp
    $(CC) $(CFLAGS) solutions/problem3.cpp $(STD)

...

所有的解决方案都是这样。 当我在控制台中重复输入 make 时,我希望得到这样的输出:

make: 对“all”没有什么可做的

但是,我每次都得到这个:

g++-5 -Wall -c solutions/problem15.cpp -std=c++14
g++-5 -Wall -c solutions/problem16.cpp -std=c++14
g++-5 -Wall -c solutions/problem20.cpp -std=c++14
g++-5 -Wall -c solutions/problem22.cpp -std=c++14
g++-5 -Wall -c solutions/problem24.cpp -std=c++14
g++-5 -Wall -c solutions/problem25.cpp -std=c++14

不是将它们的目标文件输出到 object_files/ 中, 它们被放置在与 makefile 相同的目录中。

我的目录设置如下:

project_euler
  |
  |-- downloaded_files
  |     |
  |     |-- p022_names.txt
  |-- headers
  |     |
  |     |-- bigint.h
  |-- object_files
  |     |
  |     |-- problem1.o
  |     |-- problem2.o
  |     |-- ... (other object files)
  |-- solutions
  |     |
  |     |-- problem1.cpp
  |     |-- problem2.cpp
  |     |-- ... (other .cpp files)
  |-- Makefile
  |-- p1
  |-- p2
  |-- p3
  |-- ... (other binary outputs)

所以我想我有两个问题:

1) 为什么这些随机文件每次都重新编译/将它们的 .o 文件放在根目录中?

2) 有没有什么方法可以压缩我的 Makefile,这样我就不必一次又一次地为每个解决方案编写相同的东西?

最佳答案

线

$(CC) $(CFLAGS) solutions/problem1.cpp $(STD)

不创建目标文件 object_files/problem1.o。相反,它会在运行 make 的目录中创建 .o 文件。将该行更改为:

$(CC) $(CFLAGS) -o $@ solutions/problem1.cpp $(STD)

在其他地方也做类似的改变。


您可以通过对 .o 文件使用通用规则来减少 makefile 的重复部分。

object_files/%.o: solutions/%.cpp
    $(CC) $(CFLAGS) -o $@ $(STD) $?

您可以在 https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html 阅读更多关于 GNU make 中可用的自动变量的信息.

关于c++ - Makefile 总是编译某些文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39299216/

相关文章:

c++ - 未初始化的局部变量是最快的随机数生成器吗?

c++ - 如何验证我是在使用 C++ 中的基础对象还是派生对象?

c++ - cmake - 何时在 CMakeLists.txt 文件中包含 include_directories

c++ - 从远程主机编译 C++ 11 代码的问题

c++ - 帮助在 C++ 中自动重命名

C++ Lua 从 Lua 表中获取值

c++ - 使用 LLVM 内联特定函数调用

makefile - Makefile 模式规则中的目录通配符

makefile - 使用 -MM 在 Makefile 中生成依赖项的问题

c++ - 最小网关: "No rule to make target"