2013-05-07 3 views
0

Ces commandes ont été générées de manière procédurale par un Makefile que j'ai essentiellement copié à partir des pages de tutoriel de NVIDIA; il fait plus de 100 lignes et le postera si vous le jugez nécessaire, mais ces commandes suffisent à reproduire les erreurs.Erreur de lien CUDA

g++ -m64 -I/usr/local/cuda/include -I. -I.. -I../../common/inc -I/usr/local/cuda/lib64 -o shallowwater.o -c shallowwater.cpp 

/usr/local/cuda/bin/nvcc -m64 -gencode arch=compute_10,code=sm_10 -gencode arch=compute_20,code=sm_20 -I/usr/local/cuda/include -I. -I.. -I../../common/inc -I/usr/local/cuda/lib64 -o shallowwatercudamain.o -c shallowwatercudamain.cu 

g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L -lcudart 

Les deux premiers travaux; il n'y a pas d'erreur de compilation pour l'une des deux fichiers source, mais quand la troisième commande est exécutée, je reçois l'erreur suivante:

shallowwatercudamain.o: In function `__cudaUnregisterBinaryUtil()': 
tmpxft_00004e70_00000000-4_shallowwatercudamain.compute_20.cudafe1.cpp:(.text+0x36): undefined reference to `__cudaUnregisterFatBinary' 
shallowwatercudamain.o: In function `__sti____cudaRegisterAll_66_tmpxft_00004e70_00000000_6_shallowwatercudamain_compute_20_cpp1_ii_runIt()': 
tmpxft_00004e70_00000000-4_shallowwatercudamain.compute_20.cudafe1.cpp:(.text+0x46): undefined reference to `__cudaRegisterFatBinary' 
collect2: ld returned 1 exit status 
make: *** [shallowwater] Error 1 

Voici quelques informations système:

[[email protected] code]$ nvcc --version 
nvcc: NVIDIA (R) Cuda compiler driver 
Copyright (c) 2005-2012 NVIDIA Corporation 
Built on Thu_Apr__5_00:24:31_PDT_2012 
Cuda compilation tools, release 4.2, V0.2.1221 
[[email protected] code]$ uname -a 
Linux intel19 2.6.32-71.el6.x86_64 #1 SMP Wed Sep 1 01:33:01 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux 

J'ai trouvé Quelqu'un avec une erreur similaire ici, vu ici: /usr/bin/ld: cannot find -lcudart Je suis gêné de dire que j'ai trouvé cela, fait le même changement, sauf pour g ++ au lieu de gfortran, et cela a fonctionné. Après, j'ai essayé encore et cela n'a pas fonctionné. Je reçois la même erreur avec:

g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L -L/usr/local/cuda/lib64 

Répondre

3

Cette commande ne regarde pas le droit de me:

g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L -lcudart 

Et cette commande ne regarde pas le droit de me:

g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L -L/usr/local/cuda/lib64 

Cette commande regarde droit à moi:

g++ -m64 -o shallowwater shallowwater.o shallowwatercudamain.o -L/usr/local/cuda/lib64 -lcudart 

Vous devez indiquer à g ++ où rechercher la bibliothèque cudart, c'est ce que le commutateur -L/usr/local/cuda/lib64 doit (donc il a besoin d'un chemin, vous ne pouvez pas utiliser -L en lui-même) et vous devez dire à g ++ le nom de la bibliothèque à utiliser, c'est ce que le est pour.

+0

Cela l'a fait. Merci! Je pense que je viens de lire le correctif mal quand j'ai essayé de le reproduire. Je corrige mon Makefile pour que cela fonctionne. –

1

J'ai réalisé que vous n'avez pas mis "-lcudart" dans votre dernière ligne. Avez-vous lié à cudart lorsque vous étiez en train de faire une compilation?