【发布时间】:2018-09-20 21:23:01
【问题描述】:
我有一个创建 dll 的可视化 c++ 项目。 对于这个项目,我有一个有效的 CMakeLists.txt。
现在我创建了两个 cuda 源文件来完成项目和 使用视觉工作室,构建工作正常。 我想将匹配的命令添加到我的 cmake 文件中。 谁能告诉我需要添加的基本命令吗?
我尝试构建一个使用 .cu 和 .cpp 文件的 dll 库.... 我的 cmake 文件的重要部分如下所示:
# ----------------------------------------------------------------------------
# Set Cuda properties
# ----------------------------------------------------------------------------
enable_language(CUDA)
set(CUDA_SEPARABLE_COMPILATION ON)
set(CUDA_PROPAGATE_HOST_FLAGS OFF)
if (CMAKE_SIZEOF_VOID_P MATCHES 8)
set(CUDA_64_BIT_DEVICE_CODE_DEFAULT ON)
endif()
set(CUDA_NVCC_FLAGS "-gencode arch=compute_50,code=sm_50;-rdc=true;-use_fast_math")
message(STATUS "CUDA_PROPAGATE_HOST_FLAGS: ${CUDA_PROPAGATE_HOST_FLAGS}")
message(STATUS "CUDA_HOST_COMPILER: ${CUDA_HOST_COMPILER}")
message(STATUS "CUDA_NVCC_FLAGS: ${CUDA_NVCC_FLAGS}")
# ----------------------------------------------------------------------------
# Create shared library project
# ----------------------------------------------------------------------------
add_library(${LIB_NAME} SHARED ${HEADERS} ${SOURCES} ${CUDA_SOURCES})
set(CUDA_LIBRARIES "cudadevrt.lib;cudart.lib")
target_link_libraries(${LIB_NAME} ${CUDA_LIBRARIES})
但它不会编译带有正确标志的 cuda 文件。 同样在 Visual Studio 中,预处理器定义也在属性的 cuda 部分中......有什么建议吗?
【问题讨论】:
-
@halfelf:引用问题的only answer 描述了
find_package(CUDA)的用法。现在 CMake 支持 CUDA 作为一种语言(与C、CXX或Fortran相同),因此收据已更改。在引用的问题将在“新”CMake 中获得答案之前,我不希望将其作为重复项。不幸的是,我不太了解 CUDA,所以无法准备好答案。 -
@Tsyvarev 感谢您的提示。我在我的项目中尝试过
enable_language(CUDA)。但是,我仍然建议使用find_package(CUDA)系列函数/变量,因为似乎很难找到任何有关如何链接/包含其他 cuda 库/头文件(如 npp、curand 等)的文档。 -
@GoranFlegar 感谢您的示例和开发博客。我的意思是在使用
find_package(CUDA)时,首先我不需要CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES用于标头,我也不需要find_library()用于每个cuda lib,因为它们已设置为CUDA_xxx_LIBRARY变量。新功能对我来说感觉比旧的find_package(cuda)复杂一点,或者我错过了什么? -
@halfelf 如果您正在构建
.cu文件,则不需要 CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES,仅当您从.c/.cpp文件调用 CUDA 运行时 API 时才需要。对于库,这是真的,它们没有预定义,但您始终可以为它们制作一个小包装脚本,并将其包含在您的所有项目中。