2017-08-24 139 views
2

我意識到這已經被問了很多,但我一直在試圖調試這一天,並且我還沒有找到解決方案,這將解決我的問題。Cmake在編譯時找不到-lcudart

所以,我有一個makefile:

if(GPU) 
# set(CUDA_HOST_COMPILER /usr/bin/gcc-4.8) 
    find_package(CUDA QUIET) 

    if(CUDA_FOUND) 

    include_directories(${CUDA_INCLUDE_DIRS}) 
    message(STATUS "CUDA detected") 
    set(CUDA_PROPAGATE_HOST_FLAGS OFF) 
    set(BUILD_SHARED_LIBS OFF) 
    set(CUDA_HOST_COMPILER g++) 
    set(CUDA_SEPARABLE_COMPILATION ON) 

    file(GLOB CUDA_FILES *.cu) 
    list(APPEND CUDA_NVCC_FLAGS "-gencode arch=compute_30,code=sm_30;") 
    CUDA_COMPILE(CU_O ${CUDA_FILES}) 

    # SETUP FOR CPP FILES 
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 
    include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) 

    # COMPILE AND LINK 
    cuda_add_executable(main_test ${CU_O} ${CUDA_LIBRARIES}) 

    message(STATUS "File setup seems ok.") 

    else() 

    message(STATUS "NO CUDA DETECTED! GPU-based compilation canceled.") 

    endif() 

endif() 

我想單獨編譯.CU文件,並在某些時候把它們合併成一個簡單的靜態庫。我的問題是,在這一點上,我甚至不能編譯一個可執行文件。如果我嘗試僅使用nvcc test.cu -o測試,它會完美編譯,所以這似乎是一個系統級錯誤。

我的嘗試:

分別鏈接cudart有:

ln -s /usr/local/cuda/lib64/libcudart.so /usr/local/lib/ 
ln -s /usr/local/cuda/lib64/libcudart.a /usr/local/lib/ 

然後我就翻過this偉大的職位,其中所提出的解決方案是使用$ {CUDA_LIBRARIES}變量,但是這也返回:

Linking CXX executable main_test 
/usr/bin/ld: cannot find -lcudart 

我也試過樸素簡單:

alias nvcc="nvcc -L/usr/local/cuda/lib64 -lcudart" 

但仍然沒有成功。我錯過了明顯的東西嗎?謝謝。

編輯:詳細模式新增:

-- Boost version: 1.54.0 
-- Found the following Boost libraries: 
-- date_time 
-- filesystem 
-- system 
-- regex 
-- iostreams 
-- GSL using gsl-config /usr/bin/gsl-config 
-- Using GSL from /usr 
-- :::OPENMM_INCLUDE_DIR:   
-- CUDA detected -- LiSiCa library 
-- CUDA_LIBRARIES = /usr/lib/libcudart.so 
-- File setup seems ok. 
-- Boost version: 1.54.0 
-- Found the following Boost libraries: 
-- regex 
-- Configuring done 
-- Generating done 
+0

您能否提供CMake嘗試執行的命令?你可以通過運行'VERBOSE = 1 make'來獲得這個細節。另外,''{CUDA_LIBRARIES}'的內容是什麼(例如,在'CMakeLists.txt'中添加'message(STATUS「CUDA_LIBRARIES = $ {CUDA_LIBRARIES}」''並運行'cmake') – piwi

+0

我添加了代碼make的文件,這個帖子是用輸出編輯的 –

回答

1

看來你提供的庫鏈接到cuda_add_executable()

cuda_add_executable(main_test ${CU_O} ${CUDA_LIBRARIES}) 

鑑於日誌,很顯然的CUDA_LIBRARIES內容不在編譯行中使用,因爲變量確實包含庫的絕對路徑。

我不知道CUDA具體是什麼,但通常用CMake你只提供文件編譯/處理到add_executable(),並提供庫鏈接,用target_link_libraries();這將給:

cuda_add_executable(main_test ${CU_O}) 
target_link_libraries(main_test ${CUDA_LIBRARIES}) 
+0

有趣的是,當這樣做的時候,它會拋出:nvcc fatal:nvcc支持'--relocatable-device-code = true(-rdc = true)','--device-c -dc)'和'--device-link(-dlink)'僅適用於sm_20或更高版本時 –

+0

@sdgawerzswer查看[documentation](https://cmake.org/cmake/help/v3.7/它會說''cuda_compile()'要與'add_executable()'一起使用,而'cuda_add_executable()'似乎可以同時使用;也許這樣?或者''CUDA_NVCC_FLAGS'中的標記不正確?只有猜測,我再也沒有使用過CUDA。HTH無論如何! – piwi

+0

謝謝,我想我需要更多的擺弄旗幟。 –

-1

我解決了這一點,通過禁用CXX標誌添加上方在構建樹。