Cuda CMake 3.10 CMakeLists.txt 我有一个Visual C++项目,它创建了一个DLL。 对于这个项目,我有一个工作的CMakeLists.txt

Cuda CMake 3.10 CMakeLists.txt 我有一个Visual C++项目,它创建了一个DLL。 对于这个项目,我有一个工作的CMakeLists.txt,cmake,cuda,Cmake,Cuda,现在我创建了两个cuda源文件,它们完成了项目和 使用VisualStudio,构建工作正常。 我想将匹配的命令添加到我的cmake文件中。 有人能告诉我需要添加的基本命令吗 我尝试建立一个dll库,在其中使用.cu和.cpp文件。。。。 我的cmake文件的重要部分如下所示: # ---------------------------------------------------------------------------- # Set Cuda properties # -------

现在我创建了两个cuda源文件,它们完成了项目和 使用VisualStudio,构建工作正常。 我想将匹配的命令添加到我的cmake文件中。 有人能告诉我需要添加的基本命令吗

我尝试建立一个dll库,在其中使用.cu和.cpp文件。。。。 我的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部分……有什么建议吗?

我将尝试使用评论中的讨论回答这个问题,并添加一些额外的信息

首先,有两种方法可以在CMake中启用CUDA支持。一个是旧版本,另一个是CMake 3.8中添加的新内置CUDA语言支持,并对此进行了解释。 您可以选择其中一个(但您可能希望对新项目使用内置支持),但是您必须坚持您的选择

要使用内置支持,您可以将其添加到
项目(…)
语句中,或者使用:

enable_language(CUDA);
要使用旧的
FindCUDA
包,您可以使用:

find_package(CUDA);
请注意,这两个选项使用完全不同的变量进行设置。要查看
FindCUDA
支持哪些变量,请参阅;要查看内置CUDA支持,请参阅(不要忘记
占位符可以被任何语言替换,这意味着
CUDA
也是可用的替换之一)


例如,使用
FindCUDA
可以使用
CUDA\u NVCC\u标志
手动设置编译器标志,使用内置语言支持可以使用
CMAKE\u CUDA\u标志
实现相同目的。根据经验:如果变量以
CUDA\uuu
开头,则它是
FindCUDA
包的一部分,如果变量以
CMAKE\uuu
开头,则它是内置支持的一部分。

可能重复@halfelf:for a referenced question描述了
find\u包(CUDA)的用法。
。现在,CMake支持CUDA作为一种语言(与
C
CXX
Fortran
相同),因此收据已更改。在引用的问题将在“新”CMake中获得答案之前,我不希望将其作为副本。不幸的是,我不太了解CUDA,所以无法准备答案。@Tsyvarev谢谢你的提示。我在我的项目中尝试了
enable\u language(CUDA)
。但是,我仍然建议使用
find_package(CUDA)
series函数/变量,因为似乎很难找到任何关于如何链接/包含其他CUDA库/头的文档,如npp、curand等。@GoranFlegar感谢示例和devblog。我的意思是当使用
find_-package(CUDA)
时,首先我不需要
CMAKE_-CUDA_-TOOLKIT_包含_目录
作为标题,也不需要为每个CUDA库设置
find_-library()
,因为它们已经被设置为
CUDA_-xxx_-library
变量。对我来说,新功能感觉比旧的
find_package(cuda)
要复杂一些,或者可能我错过了什么?@halfelf如果你正在构建
.cu
文件,你不需要使用CMAKE_-cuda工具包包含目录,只要你从
.c
/
.cpp
文件调用cuda运行时API。对于库,这是真的,它们没有预定义它们,但是您可以为它们创建一个小包装脚本,并将其包含在您的所有项目中。不知何故,对于我使用
cuda\u gl\u interop.h
cuda\u runtime\u api
的项目,只需添加
project(…cuda)
就会导致链接器错误,抱怨“未定义对
cudaSetDevice'
等的引用。因此我求助于
find\u paclage(CUDA)
CUDA\u add\u executable
,它链接良好。