Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cuda 5.0链接错误:未定义对_cudaRegisterLInkedBinary的引用__C++_Cuda_Linker - Fatal编程技术网

C++ cuda 5.0链接错误:未定义对_cudaRegisterLInkedBinary的引用_

C++ cuda 5.0链接错误:未定义对_cudaRegisterLInkedBinary的引用_,c++,cuda,linker,C++,Cuda,Linker,我今天从4.2更新到cuda 5.0,出现了很多链接错误,如下所示: AddLevel.o: In function __sti____cudaRegisterAll_43_tmpxft_000034f6_00000000_6_AddLevel _cpp1_ii_f49b3b40':/tmp/tmpxft_000034f6_00000000-3_AddLevel.cudafe1.stub.c:8: undefined reference to `__cudaRegisterLinkedBinar

我今天从4.2更新到cuda 5.0,出现了很多链接错误,如下所示:

AddLevel.o: In function __sti____cudaRegisterAll_43_tmpxft_000034f6_00000000_6_AddLevel
_cpp1_ii_f49b3b40':/tmp/tmpxft_000034f6_00000000-3_AddLevel.cudafe1.stub.c:8: undefined
reference to `__cudaRegisterLinkedBinary_43_tmpxft_000034f6_00000000_6_AddLevel_cpp1_ii
_f49b3b40.
每个对象文件后面都有这样一个错误

正如我在搜索的许多帖子中所建议的那样,我在linking命令的末尾添加了一些cuda库,但仍然不起作用:

nvcc  -O3 -o iTrace*.o -L/usr/local/hdf5/lib -L/usr/local/cuda/lib64
`sdl-config--libs` -lhdf5 -lmfhdf -ldf -ljpeg -lz -lcuda -lcudart -lcublas_device 
-lcudadevrt.
有人能帮我吗?我把我完整的Makefile放在最后,以防你需要它。 我还使用Kubuntu 12.04 64位版本。我的gpu是GeForce GTX 550 Ti,计算能力为2.1。此外,我还将源文件的所有后缀名从.C更改为.cu,尽管其中许多文件不包含任何设备代码。不确定这是否是个问题。但它可以与NVCC4.2一起使用

顺便问一下,这些带有下划线和数字的奇怪长文件名是如何生成的?我在/usr/local/cuda/lib64中搜索了库文件,发现所有函数都以
\uu cudaRegisterLinkedBinary\u XX(这里是一个数字)\uu
包含在
libcublas\u device.a
libcudadevrt.a
中。所以我认为添加这些-l选项应该有效 但事实并非如此

非常感谢

这是我的Makefile

HDF_DIR = /usr/local/hdf5
HDF_INCLUDE = /usr/local/hdf5/include
X11_DIR = /usr/X11R6
PRECISION = r8

COMPILER="gnu"
DEBUG="no"
OPENMP="no"

ifeq ($(COMPILER), "gnu")
CC = nvcc 
CCxx = nvcc
LDR = nvcc 
ifeq ($(DEBUG), "yes")
CFLAGS = -O0
LDFLAGS = -O0
else
CFLAGS = -O3
LDFLAGS = -O3
endif
ifeq ($(OPENMP),"yes")
CFLAGS += -fopenmp
LDFLAGS += -fopenmp
endif
endif

ifeq ($(COMPILER), "intel")
CC = icc
CCxx = icpc
LDR = icpc
ifeq ($(DEBUG), "yes")
CFLAGS = -O0
LDFLAGS = -O0
else
CFLAGS = -fast
LDFLAGS = -fast
endif
ifeq ($(OPENMP),"yes")
CFLAGS += -openmp
LDFLAGS += -openmp
endif
endif

DEFINES = INCLUDE = -I. -I$(HDF_INCLUDE) `sdl-config --cflags` -I$(X11_DIR)/include

LIBS = -L$(HDF_DIR)/lib `sdl-config --libs` -L/usr/local/cuda/lib64\
-lhdf5 -lmfhdf -ldf -ljpeg -lz -lcuda -lcudart -lcublas_device -lcudadevrt


OBJS =  AddLevel.o          \
    CreateNewRays.o         \
    DefineFieldNames.o      \
    FieldsToLoad.o          \
    FindField.o         \
    GetGrid.o           \
    Grid_ComputeVertexData.o    \
    Grid_FindNeighbors.o        \
    Grid_LoadDataHDF4.o     \
    Grid_LoadDataHDF5.o     \
    Grid_ReadGridProperties.o   \
    Grid_SetSubgridMarker.o     \
    Grid_constructor.o      \
    Grid_destructor.o       \
    InterpretKeyPress.o     \
    LoadCT.o            \
    Load_RGBA.o         \
    ListIO.o            \
    Ray_GridBoundaryCheck.o     \
    Ray_Initialize.o        \
    Ray_InterpolateValue.o      \
    Ray_Trace.o         \
    Ray_constructor.o       \
    RayTraceInteractive.o       \
    LoadAllData.o  \
    ReadGridInfo.o          \
    ReadHierarchyEntry.o        \
    ResetReloadFlag.o       \
    UnloadAllData.o         \
    UnloadGrids.o           \
    UpdateScreen.o          \
    TraceAllRays.o          \
    camera.o            \
    my_vector.o         \
    print_help.o

%.o:%.cu
$(CCxx) -arch=sm_21 -rdc=true $(DEFINES) $(INCLUDE) -D$(PRECISION) -g -dc
    $(CFLAGS)    $*.cu

iTrace: $(OBJS)
$(LDR) $(LDFLAGS) -o iTrace $(OBJS) $(LIBS) 

clean:
rm -f *~ *.o iTrace

${OBJS}: typedef.h Grid.h my_vector.h Ray.h precision.h colors.h render.h 

真奇怪。您今天已从cuda 4.2升级到cuda 5,但您的makefile已包含
-rdc=true
?无论如何,尝试将
-arch=sm_21
添加到您的
LDFLAGS
定义中,即
LDFLAGS=-O3-arch=sm_21
(在makefile的gnu部分。对于
LDFLAGS
的调试和非调试定义,可能都应该这样做)我相信您遇到的问题已经描述出来了。

嗨,Robert,谢谢你的回复-rdc=true是后来添加的,忘了提及。我刚试过你的建议,以前的错误就消失了。但出现了一个似乎更友好的错误,只有一行:“nvlink致命:在fatbinary中找不到候选项”。你知道是什么引起的吗?谢谢您的makefile中还有类似于
-lcublas\u设备的东西吗?试着摆脱你不需要的库。通常这不会是一个问题,但是
-lcublas_设备
取决于计算能力3.5,如果您使用nvcc编译,则您正在为cc 2.1编译。我认为您不需要这些库定义中的任何一个:
-lcuda-lcudart-lcublas_设备-lcudadevrt
,从link语句中删除
-lcublas\u设备
-lcudadevrt
,它应该会清除fatbinary错误。这很有效!我删除了所有四个库定义。现在我明白了为什么会发生前面的错误,因为设备链接器还需要option-arch=sm_21。再次感谢。