Cmake在编译时找不到-lcudart

时间:2017-08-24 07:46:07

标签: c++ cmake cuda

我意识到这已被问了很多,但我一直试图调试这一天,而且我没有找到解决方案,这将解决我的问题。

所以,我有一个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 test,它会完美编译,因此这似乎是系统级错误。

我尝试了什么:

将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"

但仍然没有成功。我错过了明显的东西吗?谢谢。

编辑:添加了VERBOSE模式:

-- 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

2 个答案:

答案 0 :(得分: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})

答案 1 :(得分:-1)

我通过禁用构建树中添加了上部的CXX标记来解决这个问题。