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

Makefile 总是重新编译一个文件

如何使用带有 gprof 的 makefile 重新编译依赖项?

Makefile工具使用

避免使用 makefile 进行不必要的重新编译

重建后的Makefile重新编译代码需要很多时间