【问题标题】:undefined reference to symbol 'cudaStreamCreate'未定义对符号“cudaStreamCreate”的引用
【发布时间】:2013-07-23 08:33:13
【问题描述】:

使用 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(即-lcuda,就像你已经为libcuda所做的那样)。我不能告诉你如何在 Cmake 中做到这一点,但这是问题的根源。
  • 你确定你在路径 /usr/local/cuda-5.0/lib64/libcudart.so 中有 libcudart.so 吗?检查这个,因为大多数时候它的 /usr/local/cuda/lib64/libcudart.so
  • @SagarMasuti:阅读错误信息。它在那里,编译器甚至说它可以找到它,但它应该被链接。
  • @talonmies :哎呀抱歉没有看到这一行“所以尝试将它添加到链接器命令行”.. +1 给你.. -1 给我 :(
  • @talonmies 你能把命令改成你的意思吗?如果它链接我会接受你的回答。我已经尝试过不同的东西,例如-lcudart 然后是 cudartlib 文件名,但不起作用。然后我将找出如何在 CMake 中修复。谢谢。

标签: cuda cublas


【解决方案1】:

链接器错误消息准确地告诉您如何解决此问题。

不要将共享库指定为文件,这会将它们传递给忽略它们的编译器。使用 -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,所以我可以提供尽可能多的帮助。

【讨论】:

  • 感谢您的回答。但是,我因同样的错误而失败。再研究一下似乎有一个与 MAGMA icl.cs.utk.edu/magma/forum/viewtopic.php?f=2&t=336 MAGMA 相关的双重链接问题也取决于 CUBLAS
  • @GiovanniAzua:如果 Magma 是静态编译的,请将其移动到 CuDA 库之前。链接器可以解析动态库中的循环引用,但静态对象和库是从左到右解析的。如果这是唯一使用流的代码,那么在将静态依赖注入图中之前,链接器将丢弃流 API 代码。尽管表面上很相似,但这与您之前遇到的错误不同,它是不同的......
猜你喜欢
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 2017-11-26
  • 2014-10-26
  • 2015-07-28
相关资源
最近更新 更多