C++ Makefile总是编译某些文件

C++ Makefile总是编译某些文件,c++,makefile,C++,Makefile,我已经为我的Project Euler solutions目录创建了一个Makefile,我在不断地重新编译一些解决方案时遇到了一些问题,尽管缺少更改。另外,为这些重新编译创建的*.o文件不会在我为对象文件指定的目录中创建 我的Makefile的一般要点: CC = g++-5 CFLAGS = -Wall -c LFLAGS = -Wall STD = -std=c++14 all: firsttwenty secondtwenty firsttwenty: p1 p2 p3 p4 p5

我已经为我的Project Euler solutions目录创建了一个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:对“所有”都不做任何事情

然而,我每次都会收到这样的信息:

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
它们的对象文件不是在
对象文件/
中输出的, 而是将它们放置在与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)
不创建对象文件
对象文件/problem1.o
。相反,它在运行
make
的目录中创建.o文件。将该行更改为:

$(CC) $(CFLAGS) -o $@ solutions/problem1.cpp $(STD)
在其他地方也做类似的改变


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

object_files/%.o: solutions/%.cpp
    $(CC) $(CFLAGS) -o $@ $(STD) $?
您可以在GNU make中阅读有关自动变量的更多信息。

该行

$(CC) $(CFLAGS) solutions/problem1.cpp $(STD)
不创建对象文件
对象文件/problem1.o
。相反,它在运行
make
的目录中创建.o文件。将该行更改为:

$(CC) $(CFLAGS) -o $@ solutions/problem1.cpp $(STD)
在其他地方也做类似的改变


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

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

您可以阅读更多有关GNU make at中可用的自动变量的信息。

这确实消除了重新制作问题,但这6个看似随机的对象文件仍然放在运行
make
的目录中。@IanH,也许它们是旧文件,或者您仍然以旧形式拥有这些特定对象文件的规则。您是对的。我以为它们已被重新生成,但事实上,它们是旧文件。谢谢关于如何将所有这些重复的行合并成几个规则,有什么想法吗?这确实消除了重新制作的问题,但这6个看似随机的对象文件仍然放在运行
make
的目录中。@IanH,也许它们是旧文件,或者您仍然以旧形式拥有这些特定对象文件的规则。您是对的。我以为它们已被重新生成,但事实上,它们是旧文件。谢谢关于如何将所有这些重复的行合并成几个规则,有什么想法吗?