NVIDIA CUDA 3.0 SDK Samples

Опубликовано Май 21, 2010 в GPGPU | Нет комментариев

При компилировании стандартных примеров из NVIDIA GPU Computing SDK code samples 32-bit, на платформе Windows XP в Visual Studio 2005/2008 возникает странная ошибка:

Error 35 error: identifier «IUnknown» is undefined C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\objbase.h 240
Error 37 error PRJ0019: A tool returned an error code from «Compiling with CUDA Build Rule…»

Не найден интерфейс IUnknown, являющийся базовым интерфейсом для COM/DCOM объектов.

Однако CUDA не использует COM объекты. Для исправления ситуации достаточно добавить в *.CU файлы:

#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#endif

#define WIN32_LEAN_AND_MEAN отключает в windows.h include второстепенных .h файлов, ускоряя компиляцию и одновременно избавляя нас от ошибки.
См. http://msdn.microsoft.com/en-us/library/6dwk3a1z(vs.71).aspx


Полный текст ошибки в Output был такой:

1>—— Build started: Project: CUDAWinApp1, Configuration: Debug Win32 ——
1>Compiling with CUDA Build Rule…
1>»C:\CUDA\Toolkit\bin\nvcc.exe» -arch sm_10 -ccbin «C:\Program Files\Microsoft Visual Studio 9.0\VC\bin» -Xcompiler «/EHsc /W3 /nologo /Od /Zi /RTC1 /MTd » -I»C:\CUDA\Toolkit\include» -I»C:\CUDA\SDK\C\common\inc» -maxrregcount=32 —compile -o «Debug\convolutionFFT2D.cu.obj» «c:\GPGPU\CUDAWinApp1\convolutionFFT2D.cu»
1>convolutionFFT2D.cu
1>C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\objbase.h(240): error: identifier «IUnknown» is undefined
1>C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\objbase.h(240): warning: expression has no effect
1>1 error detected in the compilation of «C:/Temp/tmpxft_00001198_00000000-12_convolutionFFT2D.cpp4.ii».
1>Project : error PRJ0019: A tool returned an error code from «Compiling with CUDA Build Rule…»
1>Build log was saved at «file://c:\GPGPU\CUDAWinApp1\Debug\BuildLog.htm»
1>CUDAWinApp1 — 2 error(s), 35 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Другие, менее изящные решения с форумов NVIDIA.

  • Добавить в objbase.h непосредственно перед определением template void** IID_PPV_ARGS_Helper(T** pp), строки:

    #include < wtypes.h >
    #include < unknwn.h >

  • Если у вас имеется другая версия Microsoft SDK, можно для компилятора NVCC в «custom build command line» добавить:
    -I «C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Include»

См. http://forums.nvidia.com/index.php?showtopic=67822

Оставить комментарий