我已经为我的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: Nothing to be done for '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,所以我不必为每个解决方案一次又一次地编写相同的东西?< / em>的
答案 0 :(得分:4)
该行
$(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中可用的自动变量的更多信息。