Когда я компилирую следующий код, содержащий конструкцию С++ 11, в Windows7x64 (MSVS2012 + Nsight 2.0 + CUDA5.5), то я не получаю ошибок, и все компилируется и работает хорошо:
#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 из CUDA5.5), я получаю ошибки:
../src/CudaCpp11.cu(5): ошибка: явный тип отсутствует ( "int" Предполагается)
../src/CudaCpp11.cu(5): ошибка: нет подходящей функции преобразования из
"thrust:: detail:: normal_iterator > " to "int" существует
2 ошибки, обнаруженные при компиляции "/tmp/tmpxft_00001520_00000000-6_CudaCpp11.cpp1.ii". делать: * [src/CudaCpp11.o] Ошибка 2
Когда я добавил строку: -stdС++ 11
в свойствах- > Строить- > Настройки- > Настройки инструмента- > Строки стажа- > Параметры препроцессора (-Xcompiler)
Я получаю больше ошибок:
/usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h(432): ошибка: Идентификатор "nullptr" равен undefined
/usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h(432): ошибка: ожидаемый ";"
...
/usr/include/С++/4.8/bits/cpp_type_traits.h(314): error: namespace "std:: __ gnu_cxx" не имеет члена
"__ normal_iterator"
/usr/include/С++/4.8/bits/cpp_type_traits.h(314): ошибка: ожидается a " > "
Ошибка nvcc: "cudafe" умер из-за сигнала 11 (Недопустимая память ссылка) make: * [src/CudaCpp11.o] Ошибка 11
Только когда я использую thrust::device_vector<int>::iterator iter = dv.begin();
в Linux-GCC, я не получаю ошибку. Но в Windows MSVS2012 все функции С++ 11 работают нормально!
Можно ли использовать С++ 11 в .cu файлах (CUDA5.5) в Windows7x64 (MSVC) и Linux64 (GCC4.8.2)?