NVCC 失败并出现错误“未定义_GLIBCXX_MATH_H”

Posted

技术标签:

【中文标题】NVCC 失败并出现错误“未定义_GLIBCXX_MATH_H”【英文标题】:NVCC fails with the error ""_GLIBCXX_MATH_H" is not defined" 【发布时间】:2018-02-06 20:38:09 【问题描述】:

我正在编译一个 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)。为什么会发生这种情况,我该如何解决?

【问题讨论】:

这应该有一个minimal reproducible example 你用的是什么编译器? @talonmies:看我的回答:-) @RobertCrovella:不是真的,因为我想明确说明答案与许多此类案例有关,而不是与一个非常具体的例子有关。 @einpoklum:问题是我有 CUDA 9 和 CUDA 9.1 以及我使用的平台上安装的每个受支持的 gcc 和 clang 版本,而我从来没有得到那个警告。永远。 【参考方案1】:

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

在 CUDA 9.0 和 9.1 中,nVIDIA 在检查它们是否已定义之前使用某些宏有点草率。这确实是头文件 crt/math_functions.hcrt/math_functions.hppmath_functions.hpp(在 CUDA 包含目录中)的问题。

但是,这通常不是实际问题,因为an undefined macro defaults to a value of 0(在 C 中,也可能在 C++ 中)。事实上,默认情况下,gcc 和 nvcc 都不会抱怨。

但是,在您的情况下,有些东西使 GCC 与 -Wundef 一起运行,它会警告您这些情况,以及 -Werror,它将所有警告升级为错误。由于您调用的是nvcc,因此命令行(可能不是您自己编写的)可能在某处有-Xcompiler="-Wundef"-Xcompiler="-Werror"

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

【讨论】:

您是从crt 导入标头吗? @talonmies:不。实际上,代码可能只是int main() ,仅此而已。

以上是关于NVCC 失败并出现错误“未定义_GLIBCXX_MATH_H”的主要内容,如果未能解决你的问题,请参考以下文章

nvcc 在调试模式下编译失败:需要单个文件

为啥 nvcc 失败允许将 T * 类型的指针转​​换为 void *?

使用gcc和nvcc编译时,eigen :: matrix反转的行为不同

使用C ++ 11时CUDA nvcc编译器失败(Linux; clang 3.8)

“不知道如何处理' nvcc 致命错误

FBSDKLoginManager 失败并出现错误代码 - 308