我将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。
答案 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是什么)。