2013-07-23 100 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