CMake+;CUDA和x2B;可分离编译->&引用;nvcc没有';我不知道如何处理''&引用;

CMake+;CUDA和x2B;可分离编译->&引用;nvcc没有';我不知道如何处理''&引用;,cmake,cuda,nvcc,compiler-flags,Cmake,Cuda,Nvcc,Compiler Flags,我使用CMake进行我的一个涉及CUDA的项目。最近,我不得不打开一些CUDA代码的“可分离编译”: set(CUDA_SEPARABLE_COMPILATION ON) 但后来,建筑开始倒塌。例如,将发生以下情况: /usr/local/cuda/bin/nvcc -gencode arch=compute_30,code=compute_30 --std=c++11 \ -Xcompiler -Wall -O3 -DNDEBUG "" "" "" "" -m64 -ccbin /us

我使用CMake进行我的一个涉及CUDA的项目。最近,我不得不打开一些CUDA代码的“可分离编译”:

set(CUDA_SEPARABLE_COMPILATION ON)
但后来,建筑开始倒塌。例如,将发生以下情况:

/usr/local/cuda/bin/nvcc -gencode arch=compute_30,code=compute_30 --std=c++11 \
   -Xcompiler -Wall -O3 -DNDEBUG "" "" "" "" -m64 -ccbin /usr/bin/cc \
   -dlink /some/where/generated_foo.cu.o -o /some/where/foo_intermediate_link.o
nvcc fatal   : Don't know what to do with ''
(为了便于阅读,行被打断,名称被缩短)

所以,问题是有什么东西触发了CMake向命令行添加一些空(带引号的)字符串,这是nvcc不喜欢的。除此之外,命令似乎很好

现在,
-O3-DNDEBUG
是我发布版本的nvcc编译标志。但我肯定没有在任何地方添加任何空字符串标志。我试图研究FindCUDA是如何构造nvcc调用的,但不太清楚这些空字符串来自何处

如果不详细介绍我的
CMakeLists.txt
,这可能是CMake的FindaCUDA模块的一个众所周知的问题,它有一个通用的解决方法

注意:我使用的是GNU/Linux Mint 18.3、CMake 3.5和CUDA 9.1。

事实证明这是一个已知的版本

解决方法是仅为活动生成配置设置特定于生成配置的编译标志,例如,而不是:

set(CUDA_NVCC_FLAGS_RELEASE ${CUDA_NVCC_FLAGS_RELEASE} -O3)
set(CUDA_NVCC_FLAGS_DEBUG ${CUDA_NVCC_FLAGS_DEBUG} -g --generate-line-info)
CMakeLists.txt
中,使用:

if (CMAKE_BUILD_TYPE_UPPER STREQUAL "RELEASE")
    set(CUDA_NVCC_FLAGS_RELEASE ${CUDA_NVCC_FLAGS_RELEASE} -O3)
elseif (CMAKE_BUILD_TYPE_UPPER STREQUAL "DEBUG")
    set(CUDA_NVCC_FLAGS_DEBUG ${CUDA_NVCC_FLAGS_DEBUG} -g --generate-line-info)
endif (CMAKE_BUILD_TYPE_UPPER STREQUAL "RELEASE")
取而代之的是(如果您有多个构建类型,则会出现更多情况)

另一种可能的选择是根本不使用FindCUDA,因为CMake从3.X版本开始就增加了对CUDA作为“一流”语言的支持(不确定X是什么)