我正在编译一个 CUDA 程序 - 一个简单而无害的程序。无论我简化多少或删除一些代码或包含文件,nvcc 都会告诉我:
In file included from /usr/local/cuda/bin/..//include/crt/common_functions.h:271:0,
from /usr/local/cuda/bin/..//include/common_functions.h:50,
from /usr/local/cuda/bin/..//include/cuda_runtime.h:115,
from <command-line>:0:
/usr/local/cuda/bin/..//include/crt/math_functions.h:8891:5: error: "_GLIBCXX_MATH_H" is not defined [-Werror=undef]
我在Linux上使用CUDA 9.0或9.1,CUDA使用GCC(5或6)。为什么会发生这种情况,我该如何解决?
tl;dr:更改有问题的编译标志。
在 CUDA 9.0 和 9.1 中,nVIDIA 在检查某些宏是否已定义之前使用它们有点草率。这确实是头文件crt/math_functions.h
、crt/math_functions.hpp
和math_functions.hpp
(在 CUDA 包含目录中)的一种问题。
但是,这通常不是实际问题,因为未定义的宏默认为值 0(在 C 中,也可能在 C++ 中)。事实上,默认情况下,GCC 和 nvcc 都不会抱怨。
但是,在您的情况下,某些东西正在使 GCC 运行-Wundef
,这会警告您这些情况,而-Werror
会将所有警告升级为错误。由于您正在调用的是nvcc
,因此命令行(可能不是您自己编写的)可能在某处-Xcompiler="-Wundef"
并-Xcompiler="-Werror"
。
删除这两个中的后者将使nvcc
成功(除非其他错误),删除这两个将使警告也消失。