Makefile只重新编译更改的对象?

时间:2016-10-06 16:18:45

标签: c++ c arrays makefile

好的,这里的新用户,我遇到了问题。我是一名新的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 - 最好是逐步说明,以便我可以从中学习。

1 个答案:

答案 0 :(得分:0)

将您的Makefile修改为:

  1. 自动生成标头依赖项。
  2. Makefile更改时重新构建并重新链接。
  3. 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