首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Makefile总是编译某些文件

Makefile总是编译某些文件
EN

Stack Overflow用户
提问于 2016-09-02 19:05:58
回答 1查看 59关注 0票数 0

我已经为我的Project解决方案目录创建了一个Makefile,并且它不断地重新编译一些解决方案有一些问题,尽管没有改变。另外,为这些重新编译创建的*.o文件不是在我为对象文件指定的目录中创建的。

我的真命天子的总纲:

代码语言:javascript
复制
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'

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

代码语言:javascript
复制
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相同的目录中。

我的目录设置如下:

代码语言:javascript
复制
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,这样我就不必一次又一次地为每个解决方案编写相同的东西了吗?

EN

回答 1

Stack Overflow用户

发布于 2016-09-02 19:16:01

线

代码语言:javascript
复制
$(CC) $(CFLAGS) solutions/problem1.cpp $(STD)

不创建对象文件object_files/problem1.o。相反,它在运行make的目录中创建make文件。将这一行改为:

代码语言:javascript
复制
$(CC) $(CFLAGS) -o $@ solutions/problem1.cpp $(STD)

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

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

代码语言:javascript
复制
object_files/%.o: solutions/%.cpp
    $(CC) $(CFLAGS) -o $@ $(STD) $?

您可以在node/Automatic-Variables.html上阅读更多关于GNU中可用的自动变量的信息。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39299216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档