由于多个重新定义错误,CUDA 样本无法编译

Posted

技术标签:

【中文标题】由于多个重新定义错误,CUDA 样本无法编译【英文标题】:CUDA samples not compiling due to multiple redefinition errors 【发布时间】:2016-07-21 19:35:07 【问题描述】:

我刚刚在带有 Xcode 7 的 OSX 10.11 上安装了 CUDA 工具包 7.5。带有 GeForce GT 750M 的 Macbook Pro

在编译(制作)示例时,我得到多个重新定义错误。这是前两个:

actual console output (partial)

错误示例:

在 tmpxft_0000b964_00000000-19_asyncAPI.compute_20.cudafe1.stub.c:1 包含的文件中: 在 /var/folders/bm/fp5n2kzd419c4mbnsmyqf1cm0000gn/T/tmpxft_0000b964_00000000-19_asyncAPI.compute_20.cudafe1.stub.c:7 中包含的文件中: 在 /Developer/NVIDIA/CUDA-7.5/bin/../include/crt/host_runtime.h:247 包含的文件中: 在 /Developer/NVIDIA/CUDA-7.5/bin/../include/common_functions.h:224 包含的文件中: 在 /Developer/NVIDIA/CUDA-7.5/bin/../include/math_functions.h:10219 包含的文件中: 在 /Developer/NVIDIA/CUDA-7.5/bin/../include/math_functions.hpp:1664 包含的文件中: /usr/include/math.h:204:48: 错误: 'inline_isfinitef' 的重新定义 内联 __attribute ((always_inline)) int inline_isfinitef(float __x) ^ /usr/include/math.h:204:58: 注意:之前的定义在这里 extern "C" __attribute((__always_inline)) 内联 int __inline_isfinitef(float __x)

错误与 math.h 包含有关。有趣的是,如果手动编译某些示例,例如 deviceQuery 示例,则可以编译并运行。

我编写的自定义代码也因相同的错误而失败。在我的代码中,如果我注释掉“math.h”并且包含错​​误是相同的。我确实包含了 NVIDIA 的 cutil_math.h

我尝试将 clang 版本更改为 6.4,但没有任何区别。我也尝试了多个编译器标志,但无济于事。

【问题讨论】:

根据Getting Started document for Mac CUDA 7.5 支持 Mac OS X 10.9 和 10.10 版本。所以你在一个不受支持的平台上。您观察到的头文件之间的不兼容性正是需要 NVIDIA 不断调整其工具链和紧密主机编译器集成所需的头文件的问题,这反过来又是允许在同一文件中混合主机和设备代码所必需的.您可能想检查 OS X 工具链是否允许您抑制这些错误。 @njuffa 而您提供的链接中的表格省略了列表中的 10.11,公平地说,7.5 Toolkit 的下载具有 10.11 的明确选项。 【参考方案1】:

我提供的解决方案可以解决问题,但将来可能会导致问题。

错误显示包含的顺序一直到问题发生的位置。在这种情况下7.5/bin/../include/math_functions.hpp:1664

在 math_functions.hpp 的第 1664 行将其下方的 #include "math.h"#include <cmath> 注释掉。这将删除重新定义,您的项目将不再出现此错误,并且示例将编译。

【讨论】:

以上是关于由于多个重新定义错误,CUDA 样本无法编译的主要内容,如果未能解决你的问题,请参考以下文章

为啥针对精度优化模型会引发错误:由于没有预测样本,精度定义不明确并设置为 0.0?

双打定义错误的CUDA atomicAdd

关于CUDA C 项目中“ error C2059: 语法错误:“<” ”问题的解决方法

无法使用 Cuda 引用编译 dll

无法使用 sudo 命令编译 cuda

cuda中的编译错误