在编译错误时制作 nvcc 输出跟踪

Make nvcc output traces on compile error

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

/usr/include/boost/utility/detail/result_of_iterate.hpp:135:338: error: invalid use of qualified-name ‘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++ 似乎出于某种原因用 "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

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

供参考的bug信息:
该错误仅出现在 CUDA 7.0 中。它在 CUDA 6.5 中不存在,在 CUDA 7.5RC 及更高版本中得到修复。它仅影响 C++11 编译模式(尝试在 C++98 中编译上述代码应该会失败)该错误也仅在 boost 1.5x(可能是 1.50 最新的 1.52)中出现,其中 decltype 用法为 boost::result_of 介绍。一个更简单的例子:

有 3 种可能的解决方法:

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