首页 文章

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

提问于
浏览
0

如果这是一个有点无聊的问题,我道歉,我一直在寻找并找不到答案 .

我是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

    不要完全明确地设置规则,请尝试下面的模式规则,最好将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 $@
    

相关问题