2012-07-10 60 views
1

我只是試圖用cuda 5.0預覽來構建我的舊項目。 鏈接時出現錯誤,告訴我某些cuda功能找不到。例如:Cuda 5.0鏈接問題

undefined reference to 'cudaMalloc'

我的鏈接命令包括CUDA以下選項:

-L在/ usr /本地/ CUDA/lib64下-L /家庭/ MYHOME/NVIDIA_CUDA_Samples/C/lib目錄-L /家庭/ MYHOME/NVIDIA_CUDA_Samples/C/common/lib目錄/ Linux的-lcudart

ls -lah /usr/local/cuda/lib64/給了我8個CUDA庫,包括與僅使用的.so文件結束的符號鏈接libcudart.so.5.0.7。

ls /home/myhome/NVIDIA_CUDA_Samples/C/lib/給我一個空目錄,這有點奇怪嗎?

ls /home/myhome/NVIDIA_CUDA_Samples/C/common/lib/linux/給了我兩個目錄:爲i686和x86_64兩個只含libGLEW.a

我不知道要尋找一個解決方案的方式。任何幫助表示讚賞!

編輯:

這裏是我完整的鏈接命令(TARGET_APPLICATION是我的二進制和x86_64/Objectfiles.o代表所有(23)對象文件包括與NVCC編譯的目標文件):

/home/myhome/nullmpi-0.7/bin/mpicxx -CC=g++ -I. -I/home/myhome/nullmpi-0.7/src -I/usr/lib/openmpi/include -L/usr/local/cuda/lib64 -L/home/myhome/NVIDIA_CUDA_Samples/C/lib -L/home/myhome/NVIDIA_CUDA_Samples/C/common/lib/linux -lcudart -o TARGET_APPLICATION x86_64/Objectfiles.o /usr/lib/liblapack.so /usr/lib/libblas.so /home/myhome/nullmpi-0.7/lib/libnullpmpi.a -lm

我使用nullmpi進行編譯和鏈接(項目使用MPI和CUDA),它在內部使用g++可以看出-CC=g++,我想保留這些東西。

我CUDA目標文件的編譯命令:

/usr/local/cuda/bin/nvcc -c -arch=sm_21 -L/home/myhome/NVIDIA_CUDA_Samples/C/lib -O3 kernelwrapper.cu -o x86_64/kernelwrapper.RELEASE.2.o

echo $LD_LIBRARY_PATH結果:

/usr/local/cuda/lib64:/usr/local/cuda/lib:

echo $PATH結果:

otherOptions :/usr/local/cuda/bin:/home/myhome/nullmpi-0.7/bin

我要建64位。爲了完整起見,我構建在Ubuntu 12.04上。 (64位)。 構建CUDA示例正常工作。

SOLUTION(感謝talonmies指着我的話):

這是正確的鏈接命令:

/home/myhome/nullmpi-0.7/bin/mpicxx -CC=g++ -I. -I/home/myhome/nullmpi-0.7/src -I/usr/lib/openmpi/include -L/usr/local/cuda/lib64 -L/home/myhome/NVIDIA_CUDA_Samples/C/lib -L/home/myhome/NVIDIA_CUDA_Samples/C/common/lib/linux -o TARGET_APPLICATION x86_64/Objectfiles.o /usr/lib/liblapack.so /usr/lib/libblas.so /home/myhome/nullmpi-0.7/lib/libnullpmpi.a -lcudart -lm

+0

請提供您的完整命令行以及您是否正在編譯32位或64位。 – harrism 2012-07-11 02:48:12

+0

這很奇怪。我通常不需要鏈接任何標準CUDA程序。你記得修改LD_LIBRARY_PATH嗎? – sj755 2012-07-11 03:55:06

+0

我沒有在您的編譯行中看到任何源文件或對象... – harrism 2012-07-11 07:29:23

回答

4

您有不正確的順序連接的語句。它應該是更多的東西是這樣的:

/home/myhome/nullmpi-0.7/bin/mpicxx -CC=g++ -I. -I/home/myhome/nullmpi-0.7/src \ 
    -I/usr/lib/openmpi/include -L/usr/local/cuda/lib64 \ 
    -L/home/myhome/NVIDIA_CUDA_Samples/C/lib \ 
    -L/home/myhome/NVIDIA_CUDA_Samples/C/common/lib/linux \ 
    -o TARGET_APPLICATION x86_64/Objectfiles.o \ 
    /home/myhome/nullmpi-0.7/lib/libnullpmpi.a -llapack -lblas -lm -lcudart 

你的問題的根源是,您所指定的CUDA運行時庫之前包含依賴於它的目標文件。鏈接器只是從鏈接中丟棄libcudart.so,因爲它在處理時沒有依賴關係。黃金法則在POSIX風格的編譯語句中:鏈接語句從左向右被解析;因此首先包含外部依賴關係的對象,之後滿足這些依賴關係的庫。

+0

嗨,非常感謝您的幫助!我應該看看POSIX的規則,直到現在我很幸運地完成我的事情。奇怪的是:我在Ubuntu 11.10和Cuda 4.1上使用完全相同的Makefiles,並且沒有任何問題。 – soriak 2012-07-11 09:54:09