【发布时间】:2019-03-20 16:09:57
【问题描述】:
我想将 .cu 和 .cpp 分别编译为 .o 文件,然后将它们链接到可执行文件。我有几个简单的文件:cuda_func.cu。 cuda_func.h 和 main.cpp。在主 cpp 中,我包含 cuda_func.h 并运行 cuda_func()。我想出了以下 cmake 代码:
project(cuda)
cmake_minimum_required(VERSION 2.8)
# CUDA PACKAGE
find_package(CUDA REQUIRED)
set(CUDA_SEPARABLE_COMPILATION ON)
set(CUDA_PROPAGATE_HOST_FLAGS OFF)
set(CUDA_HOST_COMPILER g++)
# COMPILE CU FILES
file(GLOB CUDA_FILES *.cu)
list( APPEND CUDA_NVCC_FLAGS "-gencode arch=compute_30,code=sm_30; -std=c++11")
CUDA_COMPILE(CU_O ${CUDA_FILES})
SET(CMAKE_EXE_LINKER_FLAGS "-L/usr/local/cuda/lib -lcudart")
# SETUP FOR CPP FILES
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
# COMPILE AND LINK
add_executable(main main.cpp ${CU_O})
但我得到了对“cudaMemcpy”错误的未定义引用。当我手动编译它时,使用 nvcc 和 g++ 来获取 .o 文件和 g++ 最终使其可执行,它工作正常。似乎 cuda 库最后没有正确链接。我该怎么办?
【问题讨论】:
-
你试过
cuda_add_executable而不是add_executable吗? -
确实,您忘记使用默认不会添加的 CUDA 运行时。 CMake 2.8 也很旧,不能 100% 兼容现代 CMake。
-
我使用 cmake 3.5.1。我也试过
cuda_add_executable,它给了undefined reference to __cudaRegisterLinkedBinary_44_tmpxft_...