Makefile 只重新编译更改的对象?
Posted
技术标签:
【中文标题】Makefile 只重新编译更改的对象?【英文标题】:Makefile that only recompiles changed objects? 【发布时间】:2016-10-06 16:18:44 【问题描述】:好的,新用户来了,我遇到了问题。我是一名新的 C++ 学生,我之前没有这门语言的经验(大约 3 个月前)。我的任务如下:
编写一个程序,声明一个包含 50 个 double 类型元素的数组 darray。初始化数组,使前 25 个元素等于索引变量的平方,后 25 个元素等于索引变量的 3 倍。输出数组,以便每行打印 10 个元素。 该程序应该有两个函数:一个函数 initArray(),它初始化数组元素,一个函数 prArray(),它打印元素。
我有,如下
#include "printArray.h"
#include "initializearray.h"
#include "Main.h"
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
double initArray();
double prArray(double arrayone[50]);
double * dArray;
int main()
dArray[50] = initArray();
system("PAUSE");
prArray(dArray);
system("PAUSE");
return 0;
#include "printArray.h"
#include "initializearray.h"
#include "Main.h"
#include <iostream>
#include <string>
using namespace std;
double prArray(double arraytwo[50])
for (int x = 0; x < 50; x++)
cout << arraytwo[x];
if (x = 9 || 19 || 29 || 39 || 49)
cout << endl;
return 0;
#include "printArray.h"
#include "initializearray.h"
#include "Main.h"
#include <iostream>
#include <string>
int x = 0;
double arrayone[50];
double initArray()
for (x = 0; x < 25; x++)
arrayone[x] = (x*x);
for (x = 25; x <= 50; x++)
arrayone[x] = (x * 3);
return arrayone[50];
现在我的问题是作业继续说
编写一个 Makefile 来编译上面的程序,以最大限度地减少在更改时重新编译项目。 (例如,如果一个函数文件被更新,只有必要的文件被重新编译。)包括一个干净的目标,如果调用它会删除已编译的对象。
我有一个基本的 makefile:
CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=Main.cpp initializeArray.cpp printArray.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=Main
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
.cpp.o:
$(CC) $(CFLAGS) $< -o $@
现在,我需要帮助的是把它变成一个满足分配条件的 makefile - 最好有分步说明,以便我可以从中学习。
【问题讨论】:
而这个现有的 makefile 究竟如何不满足这些要求? @SamVarshavchik ...因为缺少很多all
目标中有$(SOURCES)
?
到 OP :标准的 makefile 会自动为你做这件事。没有什么特别要求(提示:阅读man make
)
然后阅读GNU make manual。
【参考方案1】:
将您的Makefile
修改为:
-
自动生成头文件依赖。
Makefile
更改时重新构建和重新链接。
CXX := g++
LD := $CXX
CXXFLAGS := -Wall -Wextra -std=gnu++14 -pthread
LDFLAGS := -pthread
exes :=
# Specify EXEs here begin.
Main.SOURCES := Main.cpp initializeArray.cpp printArray.cpp
exes += Main
# Specify EXEs here end.
all: $(exes)
.SECONDEXPANSION:
get_objects = $(patsubst %.cpp,%.o,$$1.SOURCES)
get_deps = $(patsubst %.cpp,%.d,$$1.SOURCES)
# Links executables.
$exes : % : $$(call get_objects,$$*) Makefile
$LD -o $@ $(filter-out Makefile,$^) $LDFLAGS
# Compiles C++ and generates dependencies.
%.o : %.cpp Makefile
$CXX -o $@ -c $CPPFLAGS $CXXFLAGS -MP -MD $<
# Include the dependencies generated on a previous build.
-include $(foreach exe,$exes,$(call get_deps,$exe))
.PHONY: all
【讨论】:
非常感谢!以上是关于Makefile 只重新编译更改的对象?的主要内容,如果未能解决你的问题,请参考以下文章
用于在头文件更改时构建简单 c 项目重新编译的示例 makefile