2013-07-23 65 views
0

使用CMake构建我的项目我收到以下链接器错误,不知道如何解决它。使用make VERBOSE=1揭示看起来OK我生成的命令:对符号'cudaStreamCreate'的未定义引用

[email protected]:~/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 
+2

链接器错误消息告诉你*完全*要解决这个问题。不要将共享库指定为文件,将它们传递给忽略它们的编译器。对每个库使用'-l'(即''-lcuda',就像你已经在做libcuda一样)。我不能告诉你如何在Cmake中做到这一点,但这是该问题的根源。 – talonmies

+0

确定你的libcudart.so路径是/usr/local/cuda-5.0/lib64/libcudart.so?检查这是因为大部分时间它的/usr/local/cuda/lib64/libcudart.so –

+0

@SagarMasuti:读取错误信息。它在那里,编译器甚至说它可以找到它,但它应该被链接。 – talonmies

回答

3

链接器错误消息告诉您究竟做些什么来解决这个问题。

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

+0

谢谢你的回答。失败时会出现同样的错误。多研究一下,似乎存在一个与MAGMA相关的双链接问题http://icl.cs.utk.edu/magma/forum/viewtopic.php?f=2&t=336 MAGMA也取决于CUBLAS –

+0

@GiovanniAzua:在Magma静态编译的情况下,在* CuDA库之前移动它*链接器可以解析动态库中的循环引用,但静态对象和库从左向右解析如果这是唯一的代码使用流,然后流A在将静态依赖注入到图中之前,PI代码将被链接器丢弃。尽管外在的模糊性,这是不一样的错误,你以前,这是不同的东西.... – talonmies