CMake + CUDA +可分离编译 - > " nvcc不知道如何处理' ' "

时间:2018-02-15 11:56:10

标签: 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 /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。

1 个答案:

答案 0 :(得分:1)

事实证明, 已知CMake issue

解决方法是仅为活动构建配置设置特定于build-config的编译标志,例如而不是:

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已经增加了对CUDA的支持作为一流的"一流的"语言以3.X版本开头(不确定X是什么)。