用于多个源对象编译的Makefile依赖性规则

时间:2016-02-17 22:46:12

标签: makefile

如果这是一个有点愚蠢的问题我很抱歉,我一直在寻找并找不到答案。

我是makefiles的新手,我正在尝试创建一个将各个目录中的多个源文件编译成单个目录中的目标文件,然后链接它们。

它可以工作,但它总是会重新编译所有文件,即使我还没有改变它们。据我所知,只有依赖关系比目标更早时才应该这样做。我做错了什么?

这是我的makefile:

CC = mpic++
CCU = nvcc

ARCH = -arch=sm_52

SOURCEDIR = ./source
SOLVERDIR = $(SOURCEDIR)/solvers
OBJECTDIR = ./bin

INCLUDE   = -I./include -I/home/alexander/.openmpi/include -I/usr/local/cuda-7.5/include

LIBRARY   = -L/usr/local/cuda-7.5/lib64 -lcublas -lcudart

OUT = cgsolve

CDEPS = $(OBJECTDIR)/main.o $(OBJECTDIR)/timer.o $(OBJECTDIR)/cgMPIFuncs.o

compileC: $(CDEPS)
    $(CC) $(INCLUDE) -c $(SOURCEDIR)/main.cpp -o $(OBJECTDIR)/main.o
    $(CC) $(INCLUDE) -c $(SOURCEDIR)/timer.cpp -o $(OBJECTDIR)/timer.o
    $(CC) $(INCLUDE) -c $(SOURCEDIR)/cgMPIFuncs.cpp -o $(OBJECTDIR)/cgMPIFuncs.o

CUDEPS = $(OBJECTDIR)/BiCGStab.o $(OBJECTDIR)/CG.o $(OBJECTDIR)/solverUtil.o $(OBJECTDIR)/cudaKernels.o

compileCU: $(CUDEPS)
    $(CCU) $(ARCH) $(INCLUDE) -c $(SOLVERDIR)/BiCGStab.cu -o $(OBJECTDIR)/BiCGStab.o
    $(CCU) $(ARCH) $(INCLUDE) -c $(SOLVERDIR)/CG.cu -o $(OBJECTDIR)/CG.o
    $(CCU) $(ARCH) $(INCLUDE) -c $(SOURCEDIR)/solverUtil.cu -o $(OBJECTDIR)/solverUtil.o
    $(CCU) $(ARCH) $(INCLUDE) -c $(SOURCEDIR)/cudaKernels.cu -o $(OBJECTDIR)/cudaKernels.o

OBJDEPS = $(OBJECTDIR)/main.o $(OBJECTDIR)/BiCGStab.o $(OBJECTDIR)/CG.o $(OBJECTDIR)/solverUtil.o $(OBJECTDIR)/cudaKernels.o $(OBJECTDIR)/timer.o $(OBJECTDIR)/cgMPIFuncs.o

build:
    $(CC) $(OBJDEPS) $(LIBRARY) -o $(OUT)

all: compileC compileCU build

再次,抱歉,如果这是重复或其他什么。我还没能找到这个问题的先前版本。谢谢你的帮助!

1 个答案:

答案 0 :(得分:0)

请不要完全明确地设置规则,请尝试下面的模式规则,也可以将OBJDEPS添加为构建目标的先决条件(然后不需要compileC和compileCU,除非你想保留那些目标)

compileC: $(CDEPS)

compileCU: $(CUDEPS)

build: $(OBJDEPS)
    $(CC) $^ $(LIBRARY) -o $(OUT)

$(OBJECTDIR)/%.o :  $(SOURCEDIR)/%.cpp 
    $(CC) $(INCLUDE) -c $^ -o $@

$(OBJECTDIR)/%.o : $(SOLVERDIR)/%.cu
    $(CCU) $(ARCH) $(INCLUDE) -c $^ -o $@