我今天从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.
每个目标文件都会出现这样的错误。
正如我搜索过的很多帖子中所建议的那样,我在链接命令的末尾添加了一些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,尽管其中许多名称不包含任何设备代码。不确定这是不是一个问题。它适用于nvcc 4.2。
顺便说一句,那些带有下划线和数字的奇怪的长文件名是怎么产生的?我搜索了/ usr / local / cuda / lib64中的库文件,发现所有以__cudaRegisterLinkedBinary_XX(a number here)_
开头的函数都包含在libcublas_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
答案 0 :(得分:1)
这很奇怪。您今天从cuda 4.2升级到cuda 5,但您的makefile已包含-rdc=true
?无论如何,尝试将-arch=sm_21
添加到LDFLAGS
定义,即LDFLAGS = -O3 -arch=sm_21
(在makefile的gnu部分。可能应该为{{1}的调试和非调试定义执行此操作}})我相信您遇到的问题是here。