NVCC 失败并显示错误““_GLIBCXX_MATH_H”未定义”

ein*_*ica 2 cuda nvcc compiler-options

我正在编译一个 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]
Run Code Online (Sandbox Code Playgroud)

我在 Linux 上使用 CUDA 9.0 或 9.1,而 CUDA 使用 GCC(5 或 6)。为什么会发生这种情况,我该如何解决?

ein*_*ica 5

tl;dr:更改有问题的编译标志。

在 CUDA 9.0 和 9.1 中,nVIDIA 在检查某些宏已经定义之前使用它们有点草率。也就是说,事实上,一个排序的,一个与头文件的问题crt/math_functions.hcrt/math_functions.hpp以及math_functions.hpp(在CUDA包括目录)。

但是,这通常不是实际问题,因为未定义的宏默认值为 0(在 C 中,也可能在 C++ 中)。事实上,默认情况下,gcc 和 nvcc 都不会抱怨。

但是,在您的情况下,某些事情使 GCC 运行-Wundef,它会警告您这些情况,并且-Werror将所有警告升级为错误。由于是在调用是你nvcc,命令行(你,可能并没有自己写)可能具有-Xcompiler="-Wundef"-Xcompiler="-Werror"地方。

删除这两个中的后者将nvcc成功(除非其他错误),并且删除两者将使警告消失。