Makefile nvcc在哪里放置.o文件?当我编译时,它们出现在错误的目录中

Makefile nvcc在哪里放置.o文件?当我编译时,它们出现在错误的目录中,makefile,cuda,nvidia,nvcc,Makefile,Cuda,Nvidia,Nvcc,直截了当地说: 我有以下文件结构: MapA:makefile,main.c,step.cu,step.h,mapB mapB:model.cu,model.cuh,model_init.c,model_init.h 我用下面的makefile编译这个结构 “制作模型=mapB”: MODELDIR:=./$(模型) 模块:=$(MODELDIR) CFLAGS+=-I.$(patsubst%,-I%,$(模块)) NVCFLAGS+=-I.$(patsubst%,-I%,$(模块)) NV

直截了当地说:

我有以下文件结构:

  • MapA:makefile,main.c,step.cu,step.h,mapB
  • mapB:model.cu,model.cuh,model_init.c,model_init.h
我用下面的makefile编译这个结构 “制作模型=mapB”:

MODELDIR:=./$(模型)
模块:=$(MODELDIR)
CFLAGS+=-I.$(patsubst%,-I%,$(模块))
NVCFLAGS+=-I.$(patsubst%,-I%,$(模块))
NVCC+=NVCC
NVCFLAGS+=-arch=sm_30--ptxas选项=-O1
CFLAGS+=-墙壁-迂腐
LDLIBS+=-lz-lpthread
CFLAGS+=-g
SRCS+=step.cu$(MODELDIR)/model.cu$(MODELDIR)/model_init.c\
main.c
OBJS+=step.o$(MODELDIR)/model.o$(MODELDIR)/model_init.o
所有:。依赖于运行模型
dims.h:gen_dims.sh
/gen_dims.sh 1024
runmodel:${OBJS}main.o
${NVCC}${NVCFLAGS}${LDLIBS}$^-o$@
%.o:%.cu
${NVCC}${NVCFLAGS}-dc$<
.虚假:依赖清洁测试
依赖:
${NVCC}${NVCFLAGS}-M${SRCS}>。依赖
.depend:${SRCS}makefile dims.h
${NVCC}${NVCFLAGS}-M${SRCS}>。依赖
清洁:
${RM}${OBJS}runmodel compare*.cmo*.cmx*.cmi*.o
包括,取决于
这会导致nvlink错误,即“nvlink致命:无法打开输入文件'mapB/model.o

我查看了.o文件的放置位置,以及使用此makefile生成的.o文件的文件结构如下所示:

  • mapA:makefile,main.c,main.o,step.cu,step.o,step.h,model.o, mapB
  • mapB:model.cu,model.cuh,model_init.c,model_init.o,model_init.h
有没有人知道为什么model.o文件会出现在上面的目录而不是子文件夹中,这使得以后在编译过程中找不到它


我们也欢迎解决此问题的解决方案。

我没有nvcc,因此我不能确定,但我建议您尝试一下,并告诉我们结果:

%.o: %.cu
    ${NVCC} ${NVCFLAGS} -dc $< -o $@
%.o:%.cu
${NVCC}${NVCFLAGS}-dc$<-o$@

我没有nvcc可玩,所以我不能确定,但我建议您试试这个,并告诉我们结果:

%.o: %.cu
    ${NVCC} ${NVCFLAGS} -dc $< -o $@
%.o:%.cu
${NVCC}${NVCFLAGS}-dc$<-o$@

从哪个目录调用编译器?默认情况下,大多数(所有?)编译器将对象文件放在当前目录中。我不理解你的问题。从Makefile的外观来看,nvcc正按照您的要求发送onject文件。我无法重现您的错误。您使用的是什么版本的Make?当它构建
model.o
时,您看到了什么命令?@talonmes:既然一个makefile完全按照它被告知的那样做,那将是我的错误。但我看不到规定onject文件应该放在哪里的规则(通常情况下,我从其他人那里继承了这个makefile,并对其进行了一些修改)。对我来说,很奇怪,nvcc生成的onject文件都放在mapA中,而gcc生成的onject文件与它们的c文件放在同一个文件夹中。因此,我的问题是:如何使nvcc生成的onject文件与它们的.cu文件放在同一个文件夹中?@njuffa:我不知道如何查看编译器从何处调用,但我猜它将从mapA文件夹中调用,因为我的makefile位于该文件夹中。然而,无论.c文件位于何处,我的gcc编译器都会以某种方式被调用。我正在寻找一种方法来对我的nvcc编译器执行同样的操作。从哪个目录调用编译器?默认情况下,大多数(所有?)编译器将对象文件放在当前目录中。我不理解你的问题。从Makefile的外观来看,nvcc正按照您的要求发送onject文件。我无法重现您的错误。您使用的是什么版本的Make?当它构建
model.o
时,您看到了什么命令?@talonmes:既然一个makefile完全按照它被告知的那样做,那将是我的错误。但我看不到规定onject文件应该放在哪里的规则(通常情况下,我从其他人那里继承了这个makefile,并对其进行了一些修改)。对我来说,很奇怪,nvcc生成的onject文件都放在mapA中,而gcc生成的onject文件与它们的c文件放在同一个文件夹中。因此,我的问题是:如何使nvcc生成的onject文件与它们的.cu文件放在同一个文件夹中?@njuffa:我不知道如何查看编译器从何处调用,但我猜它将从mapA文件夹中调用,因为我的makefile位于该文件夹中。然而,无论.c文件位于何处,我的gcc编译器都会以某种方式被调用。我正在寻找一种方法来做我的nvcc编译器相同。非常感谢!它现在编译并运行。只是一个后续问题,-o$@实际上做什么?$<和$^之间的区别是什么(.cu代码有$the
-o
是。你告诉nvcc“-o foo.o”,它会将输出文件命名为“foo.o”。变量
$非常感谢!它现在编译并工作了。接下来的问题是,-o$@实际上做什么?和$^之间的区别是什么(该.cu代码有$the
-o
is。您告诉nvcc“-o foo.o”,它会将输出文件命名为“foo.o”。变量
$