在编译错误

时间:2015-08-11 11:24:07

标签: c++ cuda compiler-errors nvcc

使用nvcc编译代码时遇到了一些麻烦。它严重依赖于模板等,因此很难读取错误消息。例如,目前我收到了一条消息

  

/usr/include/boost/utility/detail/result_of_iterate.hpp:135:338:   错误:无效使用qualified-name   “的std :: allocator_traits< _Alloc> :: propagate_on_container_swap”

这不是很有帮助。没有关于它来自何处或模板参数是什么的信息。用例如编译gcc显示了一些非常好的输出,包括候选和模板参数等。

无论如何有可能获得nvcc的人吗?或者至少对于主机代码?只有使用无法消除的cuda函数,才能用gcc编译。

这个问题不是关于那个特定的错误,而是关于如何从任何错误的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 ++出于某种原因用“TriggerError :: SomethingWentWrong”替换了“type”标记。所以这似乎是一个CUDA错误。

nvcc --version:Cuda编译工具,7.0版,V7.0.27

gcc --version:gcc(Ubuntu 4.8.4-2ubuntu1~14.04)4.8.4

1 个答案:

答案 0 :(得分:3)

关于主要问题:没有任何标志或任何使nvcc输出比现有模板信息更多的模板信息。显示的错误是语法错误而不是模板实例化错误,但它是由CUDA 7.0中的错误引起的。

有关错误的信息以供参考:
该错误仅发生在CUDA 7.0中。它不在CUDA 6.5中,并且已在CUDA 7.5RC及更高版本中修复。它只影响C ++ 11编译模式(尝试在C ++ 98中编译上面的代码应该失败)这个bug也只发生在boost 1.5x(可能是1.50最新的1.52)中,其中boost :: result_of的decltype用法被介绍了。一个更简单的例子:Compilation error with nvcc and c++11, need minimal failing example

有三种可能的解决方法:

  1. 使用std::result_of(c ++ 11)
  2. 包括<boost/utility/result_of.hpp>作为第一个包含
  3. 使用boost TR1协议并定义BOOST_RESULT_OF_USE_TR1