我意识到这已被问了很多,但我一直试图调试这一天,而且我没有找到解决方案,这将解决我的问题。
所以,我有一个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
答案 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标记来解决这个问题。