对符号'的未定义引用;cudaStreamCreate';

对符号'的未定义引用;cudaStreamCreate';,cuda,cublas,Cuda,Cublas,使用CMake构建项目时,我遇到以下链接器错误,不知道如何解决它。使用make VERBOSE=1可以显示生成的命令,这些命令在我看来是正常的: azg@HPC:~/code/myproject/build_debug$ /usr/bin/c++ -Wall -Wextra -Wshadow -Woverloaded -virtual -g3 -ggdb3 -fopenmp CMakeFiles/mymain.dir/main/cpp /algorithm/mymain.cc.o

使用CMake构建项目时,我遇到以下链接器错误,不知道如何解决它。使用
make VERBOSE=1
可以显示生成的命令,这些命令在我看来是正常的:

azg@HPC:~/code/myproject/build_debug$ /usr/bin/c++ -Wall -Wextra -Wshadow -Woverloaded
   -virtual  -g3 -ggdb3 -fopenmp CMakeFiles/mymain.dir/main/cpp
   /algorithm/mymain.cc.o -o mymain -rdynamic 
   my_library.a /opt/dev/boost/lib/libboost_filesystem.a /opt/dev/boost      
   /lib/libboost_graph.a /opt/dev/boost/lib/libboost_system.a /opt/dev/boost
   /lib/libboost_program_options.a /opt/dev/boost/lib/libboost_chrono.a /usr/local
   /hdf5/lib/libhdf5.so -lz -lrt -ldl -lm /usr/local/cuda-5.0/lib64/libcudart.so -lcuda 
   /usr/local/cuda-5.0/lib64/libcublas.so /opt/dev/magma/1.4.0-beta2/lib/libmagma.a  
   /opt/intel/lib/intel64/libimf.so -Wl,-rpath,/usr/local/hdf5/lib:/usr/local/cuda-
   5.0/lib64:/opt/intel/lib/intel64/usr/bin/ld:/usr/local/cuda-5.0/lib64/libcublas.so: 
和链接器错误:

undefined reference to symbol 'cudaStreamCreate'
/usr/bin/ld: note: 'cudaStreamCreate' is defined in DSO /usr/local/cuda-5.0/lib64/libcudart.so so try adding it to the linker command line
/usr/local/cuda-5.0/lib64/libcudart.so: could not read symbols: Invalid operation
collect2: ld returned 1 exit status

链接器错误消息将确切地告诉您如何修复此问题

不要将共享库指定为文件,这样会将它们传递给忽略它们的编译器。用-L将每个库搜索路径传递给链接器,用-L将每个库存根名称传递给链接器。链接器将搜索库的合适版本(共享或静态,具体取决于可用的版本和您传递的构建选项),然后将依赖项的完整列表链接在一起。生成的生成命令可能如下所示:

c++ -Wall -Wextra -Wshadow -Woverloaded \
   -virtual  -g3 -ggdb3 -fopenmp CMakeFiles/mymain.dir/main/cpp \
   /algorithm/mymain.cc.o -o mymain -rdynamic my_library.a \
   -L/opt/dev/boost/lib \
   -L/usr/local/hdf5/lib \
   -L/usr/local/cuda-5.0/lib64 \
   -L/opt/dev/magma/1.4.0-beta2/lib \
   -L/opt/intel/lib/intel64 \
   -lboost_filesystem \
   -lboost_graph \
   -lboost_system \
   -lboost_program_options \
   -lboost_chrono \
   -lhdf5 \
   -lz -lrt -ldl -lm \
   -lcudart \
   -lcuda \
   -lcublas \
   -lmagma \
   -limf
   -Wl,-rpath,/usr/local/hdf5/lib:/usr/local/cuda- 5.0/lib64:/opt/intel/lib/intel64/usr/bin/ld

(巨大免责声明:在拉普兰中部一个非常小的GSM连接结束时,剪切粘贴在iPad上。


我不知道您是如何让Cmake做到这一点的,而且您还没有向我们展示一个Makefile,因此这是我所能提供的最大帮助。

链接器错误消息正告诉您如何修复此问题。不要将共享库指定为文件,这样会将它们传递给忽略它们的编译器。对每个库使用
-l
(例如,
-lcuda
,就像您对libcuda所做的那样)。我无法告诉您如何在Cmake中实现这一点,但这就是问题的根源。r您确定您在路径/usr/local/cuda-5.0/lib64/libcudart.so中有libcudart.so吗?选中此选项是因为大多数情况下它是/usr/local/cuda/lib64/libcudart。so@SagarMasuti:读取错误消息。它在那里,编译器甚至说它可以找到它,但是它应该被链接。@Talonmes:Oops抱歉没有看到这一行“所以请尝试将它添加到链接器命令行”+1代表美国-1对我来说:(@Talonmes您能将命令更改为您的意思吗?如果它链接,我将接受您的答案。我已经尝试了不同的方法,例如-lcudart,然后是cudartlib文件名,但不起作用。然后我将了解如何在CMake中进行修复。谢谢。谢谢您的回答。但是,我失败了,出现了相同的错误。似乎需要进一步研究是否与岩浆有关的双重链接问题也取决于CUBLAS@GiovanniAzua:如果Magma是静态编译的,请将其移到CuDA库之前。链接器可以解析动态库中的循环引用,但静态对象和库是从左到右解析的。如果这是使用流的唯一代码,则strea在将静态依赖项注入图形之前,链接器将丢弃m API代码。尽管存在外部相似性,但这与您之前遇到的错误不同,它有所不同。。。。