2016-09-02 96 views
0

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

我的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,所以我没有时间为每个解决方案后写同样的事情时?

回答

4

线

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

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

$(CC) $(CFLAGS) -o [email protected] solutions/problem1.cpp $(STD) 

在其他位置做出类似的更改。


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

object_files/%.o: solutions/%.cpp 
    $(CC) $(CFLAGS) -o [email protected] $(STD) $? 

你可以阅读更多关于GNU提供的自动变量使得在https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html

+0

这确实消除了重新编译的问题,但这6个看似随机的目标文件仍放在运行'make'的目录中。 –

+0

@IanH,也许它们是旧文件,或者您仍旧拥有旧形式中特定对象文件的规则。 –

+0

你说得对。我认为它们已经被再生,但实际上它们是旧文件。谢谢!关于如何将所有这些重复行合并成一对规则的想法? –