【发布时间】:2014-02-22 20:14:35
【问题描述】:
当我在 Windows7x64 (MSVS2012 + Nsight 2.0 + CUDA5.5) 中编译以下包含设计 C++11 的代码时,我没有收到错误,并且一切都编译并运行良好:
#include <thrust/device_vector.h>
int main() {
thrust::device_vector<int> dv(10);
auto iter = dv.begin();
return 0;
}
但是当我尝试在 Linux64(Debian 7 Wheezey + Nsight Eclipse from CUDA5.5)下编译它时,我得到了错误:
../src/CudaCpp11.cu(5):错误:缺少显式类型(“int” 假设)
../src/CudaCpp11.cu(5):错误:没有合适的转换函数来自
"thrust::detail::normal_iterator>" 到 "int" 存在
在编译过程中检测到 2 个错误 “/tmp/tmpxft_00001520_00000000-6_CudaCpp11.cpp1.ii”。制作:* [src/CudaCpp11.o] 错误2
当我添加行时:-stdc++11
在属性->构建->设置->工具设置->构建阶段->预处理器选项(-Xcompiler)
我收到更多错误:
/usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h(432):错误: 标识符“nullptr”未定义
/usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h(432):错误: 期望一个“;”
...
/usr/include/c++/4.8/bits/cpp_type_traits.h(314):错误:命名空间 "std::__gnu_cxx" 没有成员
“__normal_iterator”
/usr/include/c++/4.8/bits/cpp_type_traits.h(314):错误:预期 ">"
nvcc 错误:“cudafe”因信号 11 而死(内存无效 参考)制作:* [src/CudaCpp11.o] 错误 11
仅当我在 Linux-GCC 中使用 thrust::device_vector<int>::iterator iter = dv.begin(); 时,我才不会收到错误消息。但在 Windows MSVS2012 中,所有 c++11 功能都可以正常工作!
我可以在 Windows7x64 (MSVC) 和 Linux64 (GCC4.8.2) 的 .cu 文件 (CUDA5.5) 中使用 C++11 吗?
【问题讨论】:
-
gcc 4.8.x 在linux下不是officially supported compiler。
-
@Robert Crovella GCC 4.7.2 具有相同的效果 - 无法在 nvcc+gcc 中编译 C++11。或者我该怎么做,或者我可以在 nvcc+icc(英特尔编译器)中使用 C++11 吗?
-
从我的脑海中浮现:最后我可以参加一个关于 GPU 编程的讲座。只需1.5小时。从那里我记得我们在幻灯片上看到的所有代码都是基于 C99 的 GPU 特殊语言。不知道是不是CUDA,我记不太清楚了。但如果是,则意味着该语言甚至不是 C 或 C++,它只是基于 C99。也许新特性会来自 C 或 C++ 的新标准,也许不会。您必须跟踪特定语言的发展。但是,如果是其他内容,请忽略此评论。稍后我将尝试找到有关此主题的更多信息。
标签: gcc c++11 cuda nvidia nvcc