2013-03-08 61 views
2

我更新到CUDA從今天4.2 5.0,並得到了很多鏈接錯誤的是這樣的:CUDA 5.0連接錯誤:未定義參考__cudaRegisterLInkedBinary_

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 64bit版本。我的GPU是具有計算能力2.1的GeForce GTX 550 Ti。我還將源文件的所有後綴名稱從.C更改爲.cu,儘管其中許多後綴名不包含任何設備代碼。不知道這是否是一個問題。它雖然與nvcc 4.2一起工作。

順便說一句,那些奇怪的長文件名如何生成下劃線和數字?我在/ usr/local/cuda/lib64中搜索了庫文件,發現所有以__cudaRegisterLinkedBinary_XX(a number here)_開頭的函數都包含在libcublas_device.alibcudadevrt.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 

回答

1

這很奇怪。您今天從cuda 4.2升級到cuda 5,但您的makefile已包含-rdc=true?無論如何,嘗試在LDFLAGS定義中添加-arch=sm_21,即LDFLAGS = -O3 -arch=sm_21(在makefile的gnu部分中。可能應該爲LDFLAGS的調試和非調試定義執行此操作)我相信您遇到的問題描述爲here

+0

嗨羅伯特,謝謝你的回覆。 -rdc = true後來被添加,忘記提及。我剛剛嘗試了你的建議,舊的錯誤消失了。但一個看似更友善的錯誤發生,只有一行:「nvlink致命:在fatbinary中找不到候選人」。你知道可能會導致什麼嗎?謝謝 – Stone 2013-03-08 06:05:51

+0

你的makefile裏還有'-lcublas_device'嗎?嘗試擺脫你不需要的庫。通常這不會是一個問題,但'-lcublas_device'取決於計算能力3.5並且您正在編譯cc 2.1如果您使用nvcc編譯,我認爲您不需要這些庫定義中的任何一個:'-lcuda - lcudart -lcublas_device -lcudadevrt' – 2013-03-08 06:15:48

+0

特別是,從鏈接語句中刪除'-lcublas_device'和'-lcudadevrt',它應該清除那個二進制錯誤。 – 2013-03-08 06:26:32