Makefile总是编译某些文件
Makefile always compiling certain files
我已经为我的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: 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,所以我不必一次又一次地为每个解决方案写同样的东西?
$(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中可用的自动变量的更多信息。
相关文章:
- 使用 Makefile 中的头文件编译 Pybind (不使用 cmake)
- 如何使用命令提示符、记事本和 MinGW 使用主文件、头文件和实现文件编译C++程序?
- 无论如何可以将webm / mp4文件编译/记忆为.exe程序吗?(C++)
- 从生成文件编译错误:"Unable to open output file" ..."No such file or directory"
- 如何使用 GLFW 预编译的二进制文件编译 Visual Studio 2019 发布版本
- Arduino IDE中自定义库类的.h文件编译错误的原因是什么
- makefile和错误将与大型项目分开的文件编译
- 如何使用生成文件编译具有多个目录的 c++ 项目
- 我可以将Visual Studio 2015头文件编译成dll并在VS2013中使用它吗?
- 使用Bazel将C 文件编译为python.h
- 使用 .a 文件编译简单的C++文件
- OpenCV 3.2 文件编译
- 如何从多个 cpp 文件编译 WebAssembly
- 从多个文件编译可以"undefined reference"
- 使用静态依赖性为共享二进制文件编译语法需要更加清晰
- 将Gsoap Src文件编译到我的项目中
- 如何用多个文件编译make下的dlib
- 字段的类型不完整,从多个文件编译
- 强制将特定文件编译为Objective-C/文件类型,但将整个项目编译为Objective C++
- OpenGLES 标头(包括 Availability.h)可防止 CPP 文件编译