【发布时间】:2015-11-03 14:25:39
【问题描述】:
我在用 nvcc 编译一些代码时遇到了一些麻烦。它严重依赖模板等,因此错误消息难以阅读。例如,目前我正在收到一条消息
/usr/include/boost/utility/detail/result_of_iterate.hpp:135:338: 错误:无效使用限定名 ‘std::allocator_traits<_alloc>::propagate_on_container_swap’
这不是很有帮助。没有关于它来自哪里或模板参数是什么的信息。用例如编译gcc 显示了一些非常好的输出,带有候选和模板参数等。
是否也有可能获得具有 nvcc 的人?或者至少对于主机代码?只用 gcc 编译是不可能的,因为使用了无法消除的 cuda 函数。
这个问题不是关于那个特定的错误,而是关于如何从 nvcc 获取有关任何错误的更多详细信息。这只是一个例子
精简的工作示例(使用 nvcc -std=c++11 编译):
#include <memory>
#include <boost/utility/result_of.hpp>
struct foo{
int operator()(int x){ return x + 42; }
};
typename boost::result_of < foo(int) >::type
bar(int x){ return foo()(x); }
int main(int argc, char**argv){
return bar(argc);
}
甚至更少的代码:
template<typename T>
struct TriggerError{
private:
template<typename _Tp>
static float helper(_Tp*);
static int helper(...);
typedef decltype(helper((T*)0)) privateWrong;
public:
typedef privateWrong SomethingWentWrong;
};
#include <boost/utility/result_of.hpp>
struct foo{
int operator()(int x){ return x + 42; }
};
typename boost::result_of < foo(int) >::type
bar(int x){ return foo()(x); }
int main(int argc, char**argv){
return bar(argc);
}
看来,cudafe++ 出于某种原因将“type”标记替换为“TriggerError::SomethingWentWrong”。所以这似乎是一个 CUDA 错误。
nvcc --version:Cuda 编译工具,7.0 版,V7.0.27
gcc --version: gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4
【问题讨论】:
-
请发一个Minimal, Complete, and Verifiable example 生成这样的消息;请同时指定您的 CUDA 和 GCC 版本
-
实际上,nvcc 在后台使用 gcc 来编译宿主代码,包括 boost 包含文件。 @m.s. 要求的信息。实际上会对其他试图帮助你的人有所帮助。如果您只包含更多的错误输出(您显示的行之前的内容),这甚至会有所帮助。但这一切似乎都不是您想要做的。所以也许其他人会有你正在寻找的答案。
-
这个 bug 似乎在 cuda 7.5RC 中修复了。
-
与您所做的 gcc 的比较是似是而非的,因为 gcc 不会对给定文件抛出任何错误。如果您要获取给定文件,并按照 nvcc 在预处理期间的方式对其进行修改,然后尝试按照 nvcc 的方式将其提供给 gcc,我声称您将从 gcc 获得 完全相同的输出。因此,表明 gcc 很棒的比较是从苹果到橘子,因为产生任何类型错误输出的 gcc 测试用例是一个不同的测试用例。
标签: c++ cuda compiler-errors nvcc