

環境は  
Windows10 （64bit）  
CUDA 9.1

こちらがソースコードです

[code]

    #include <opencv2/opencv.hpp>
    #include <opencv2/gpu/gpu.hpp>
    #include <ocvlibs.h>
    
    using namespace cv;
    
    //--------------------------------------------------------------------------
    //main
    int main(int argc, char* argv[])
    {
        try
        {
            int wait = 1;
            int numOfGpu = gpu::getCudaEnabledDeviceCount();
    
            if (numOfGpu <= 0)
                throw ("no Gpu available.");
    
            VideoCapture capture;
    
            if (argc == 2)
            {
                capture = VideoCapture(argv[1]);
                wait = 33;
            }
            else
                capture = VideoCapture(0);
    
            const char* wName = "dst";
            Mat src, dst;
            gpu::GpuMat gpuSrc, gpuDst;
            namedWindow(wName, CV_WINDOW_AUTOSIZE);
    
            while (true)
            {
                capture >> src;
                if (src.empty()) break;
    
                gpuSrc.upload(src);
                gpu::cvtColor(gpuSrc, gpuDst, COLOR_RGB2GRAY);
                gpuDst.download(dst);
    
                imshow(wName, dst);
    
                if (waitKey(wait) >= 0) break;
            }
        }
        catch (const char* str)
        {
            std::cout << str << std::endl;
        }
        catch (const cv::Exception* ex)
        {
            std::cout << "Error: " << ex->what() << std::endl;
        }
        return 0;
    }
    
[/code]

ヘッダファイルは特有のものなのでこちらに載せます。

[code]

    //--------------------------------------------------------------------------
    #ifdef _DEBUG                                   //Debugモードの場合
        #pragma comment(lib,"opencv_calib3d246d.lib")
        #pragma comment(lib,"opencv_core246d.lib")
        #pragma comment(lib,"opencv_contrib246d.lib")
        #pragma comment(lib,"opencv_features2d246d.lib")
        #pragma comment(lib,"opencv_flann246d.lib")
        #pragma comment(lib,"opencv_gpu246d.lib")
        #pragma comment(lib,"opencv_haartraining_engined.lib")
        #pragma comment(lib,"opencv_highgui246d.lib")
        #pragma comment(lib,"opencv_imgproc246d.lib")
        #pragma comment(lib,"opencv_legacy246d.lib")
        #pragma comment(lib,"opencv_ml246d.lib")
        #pragma comment(lib,"opencv_objdetect246d.lib")
        #pragma comment(lib,"opencv_ts246d.lib")
        #pragma comment(lib,"opencv_video246d.lib")
    #else                                           //Releaseモードの場合
        #pragma comment(lib,"opencv_calib3d246.lib")
        #pragma comment(lib,"opencv_core246.lib")
        #pragma comment(lib,"opencv_contrib246.lib")
        #pragma comment(lib,"opencv_features2d246.lib")
        #pragma comment(lib,"opencv_flann246.lib")
        #pragma comment(lib,"opencv_gpu246.lib")
        #pragma comment(lib,"opencv_haartraining_engine.lib")
        #pragma comment(lib,"opencv_highgui246.lib")
        #pragma comment(lib,"opencv_imgproc246.lib")
        #pragma comment(lib,"opencv_legacy246.lib")
        #pragma comment(lib,"opencv_ml246.lib")
        #pragma comment(lib,"opencv_objdetect246.lib")
        #pragma comment(lib,"opencv_ts246.lib")
        #pragma comment(lib,"opencv_video246.lib")
    #endif
    
[/code]

こちらがエラーになります。

[code]

    GPUGPU.cu
    C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1\bin/../include\cuda_runtime.h: warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してくださ い。
    C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1\bin/../include\w32api.h(186): warning C4005: '_EXTERN_C': マクロが再定義されました。
    C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/../../VC/INCLUDE\yvals.h(560): note: '_EXTERN_C' の以前の定義を確認してください
    c:\program files\nvidia gpu computing toolkit\cuda\v9.1\include\cuda_runtime_api.h(1950): warning C4819: ファイルは、現 在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してく ださい。
    c:\program files\nvidia gpu computing toolkit\cuda\v9.1\include\cuda_runtime_api.h(1950): warning C4819: ファイルは、現 在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してく ださい。
    c:\program files\nvidia gpu computing toolkit\cuda\v9.1\include\crt\math_functions.h: warning C4819: ファイルは、現在の コード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してくださ い。
    c:\program files\nvidia gpu computing toolkit\cuda\v9.1\include\crt\math_functions.h(838): warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してく ださい。
    c:\program files\nvidia gpu computing toolkit\cuda\v9.1\include\crt\math_functions.h(1772): warning C4819: ファイルは、 現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存して ください。
    c:\program files\nvidia gpu computing toolkit\cuda\v9.1\include\crt\math_functions.h(2628): warning C4819: ファイルは、 現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存して ください。
    c:\program files\nvidia gpu computing toolkit\cuda\v9.1\include\crt\math_functions.h(3477): warning C4819: ファイルは、 現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存して ください。
    c:\program files\nvidia gpu computing toolkit\cuda\v9.1\include\crt\math_functions.h(4417): warning C4819: ファイルは、 現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存して ください。
    c:\program files\nvidia gpu computing toolkit\cuda\v9.1\include\crt\math_functions.h(5319): warning C4819: ファイルは、 現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存して ください。
    c:\program files\nvidia gpu computing toolkit\cuda\v9.1\include\crt\math_functions.h(6229): warning C4819: ファイルは、 現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存して ください。
    c:\program files\nvidia gpu computing toolkit\cuda\v9.1\include\crt\math_functions.h(7104): warning C4819: ファイルは、 現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存して ください。
    c:\program files\nvidia gpu computing toolkit\cuda\v9.1\include\crt\math_functions.h(7914): warning C4819: ファイルは、 現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存して ください。
    c:\program files\nvidia gpu computing toolkit\cuda\v9.1\include\crt/device_functions.h: warning C4819: ファイルは、現在 のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してくだ さい。
    c:\program files\nvidia gpu computing toolkit\cuda\v9.1\include\crt/device_functions.h(776): warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存して ください。
    c:\program files\nvidia gpu computing toolkit\cuda\v9.1\include\crt/device_functions.h(1636): warning C4819: ファイルは 、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存し てください。
    c:\program files\nvidia gpu computing toolkit\cuda\v9.1\include\crt\device_double_functions.h: warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存し てください。
    c:\program files\nvidia gpu computing toolkit\cuda\v9.1\include\sm_20_intrinsics.h: warning C4819: ファイルは、現在のコ ード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してください 。
    c:\program files\nvidia gpu computing toolkit\cuda\v9.1\include\sm_20_intrinsics.h(925): warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを Unicode 形式で保存してくだ さい。
    C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1\bin/../include\float.h(57): fatal error C1021: プリプロセッサ コマンド 'include_next' が無効です。
    
[/code]

ヘッダファイルはちゃんと読み込めているはずなのにエラーが出る理由がいまいちわかりません。  
なぜこのようなエラーが出るのでしょうか？  
どうか解決のためにお力を貸していただけないでしょうか？


CC BY-SA 3.0
2018-03-27T10:42:38.587
42672
2018-04-10T09:07:48.600
2018-03-27T12:50:46.373
3060
27296
question
c++ cuda gpu
CUDAのNVCCでコマンドプロンプトでコンパイルしたいのですがエラーが出てきます。


ヘッダファイル含め、ソースコードの記述にはどんなソフトを使用されていますか？さすがにメモ帳ということはないと思いますが、作成したヘッダファイル(*.h)の文字コードが932(Shift-
JIS)で保存されているためコンパイルエラーになっているようです。

文字コードを指定して保存出来るエディタを使用して、ヘッダファイルやソースコードをUnicode(UTF-8)で保存し直してみてください。

参考：  
[Windows向けのテキストエディタ(窓の杜)](https://forest.watch.impress.co.jp/library/nav/genre/offc/document_txteditor.html)  
[Notepad++でファイルの文字コードを変更する](https://www.howtonote.jp/notepadplusplus/install/index7.html)


CC BY-SA 3.0
2018-03-27T13:10:02.680
42674
2018-03-27T13:10:02.680
3060
42672
answer


nvccはCUDAのカーネルコード（GPU用デバイスコード）をコンパイルし、CPU用ホストコードとの連結部分（ディスパッチャー）を自動生成するための特殊なコンパイラーです。nvcc単独では意味をなしません。  
CPU用ホストコードは、nvccが寄生する **ホストコンパイラー**
に渡されてコンパイルされます。Windows環境では通例ホストコンパイラーとしてVisual C++ (cl.exe) が使われます。  
ホスト環境は何を使っていますか？（Visual Studioのバージョンはいくつですか？）  
本来`#include_next`はGCC固有のプリプロセッサなので、おそらくnvccとホストコンパイラーの連携が正しく構成されていないことが原因です。

しかし、そもそもnvccを使いたい理由は何ですか？

見たところ、単にOpenCV
2.4.6のgpuモジュールを使っているだけのようなので、nvccを使う必要はまったくないはずです。普通に`.cpp`としてコンパイルすべきコードのはずです。  
また、基本的にコマンドラインでnvccを使う必要はなく、通例CUDA Toolkitと同時にインストールされる **Visual
Studioインテグレーション** を使えば、Visual
C++プロジェクト中の`.cu`ファイルはnvccを使ってコンパイルされるようになります。CUDA入門者は通例CUDAコンソールアプリケーションのプロジェクトテンプレートをベースに学習します。また、
**CUDA C/C++言語** を使うコードのみを`.cu`に記述し、通常のC/C++関数としてラップして、 **CUDA C/C++言語**
を使わないコードは`.c`あるいは`.cpp`に記述するのが常套手段です。

なお、C4819はエラーではなく、Visual
C++コンパイラーからの警告です。警告を消すために、むやみにファーストパーティ製やサードパーティ製のライブラリヘッダーを書き換えるべきではありません。  
もし本当にnvccを使わなければならない（ **CUDA C/C++言語** を使わなければならない）場合、Visual
C++プロジェクト内の`.cu`ファイルのプロパティにて、  
[CUDA C/C++]→[Command Line]→[Additional Options]に  
`-Xcompiler "/wd 4819"`  
を指定すれば、ライブラリヘッダーを不必要に書き換えることなく、C4819の警告は消せます。

`-Xcompiler`はホストコンパイラーにオプションを渡すときに使用します。詳しくはnvccのマニュアルを参照してください。  
<http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html>

また、CUDA Toolkitのバージョンによって、サポートしているVisual StudioおよびVC++コンパイラーのバージョンは異なります。CUDA
Toolkit 9.1がサポートしているのはVisual Studio
2012/2013/2015/2017です。VS2010のサポートはdeprecated (廃止予定) となっています。  
<http://docs.nvidia.com/cuda/cuda-installation-guide-microsoft-
windows/index.html>


CC BY-SA 3.0
2018-03-27T15:48:54.707
42678
2018-03-27T16:46:44.433
2018-03-27T16:46:44.433
15413
15413
42672
answer


CUDAを使わない方向で話が進んでいそうなので必要ないかもしれませんが、

> warning C4819: ファイルは、現在のコード ページ (932) で表示できない文字を含んでいます。データの損失を防ぐために、ファイルを
> Unicode 形式で保存してくださ い。

cubickさんはソースコードの保存し直しを、syghさんは`/wd 4819`による警告の抑止を提示されていますが、Visual C++
2015で追加された[`/source-charset (Set Source Character
Set)`](https://msdn.microsoft.com/en-
us/library/mt708819.aspx)オプションを設定することをお勧めします。Visual
C++ではUnicode対応のため文字コードの解析が必要です（`L""`文字列はソースコードのバイト列そのままでなくUnicodeへ変換します）。BOMが付けられているソースコードには問題ありませんが、付けられていない場合は現在のOSの設定を使用しShift-
JIS（codepage
932）であると推測します。国外から入手したソースコードはWindows-1252等が使われていることがあり、その場合はVisual C++であれば

[code]

    /source-charset:.1252
    
[/code]

もしくはCUDAであれば

[code]

    -Xcompiler "/source-charset:.1252"
    
[/code]

を指定することでソースコードの文字コードを正しく認識できます。ただし、今度はShift-JISが使えなくなることに注意が必要です。

* * *

> C:\Program Files\NVIDIA GPU Computing
> Toolkit\CUDA\v9.1\bin/../include\w32api.h(186): warning C4005: '_EXTERN_C':
> マクロが再定義されました。  
>  C:/Program Files (x86)/Microsoft Visual Studio
> 14.0/VC/bin/../../VC/INCLUDE\yvals.h(560): note: '_EXTERN_C' の以前の定義を確認してください
>
> C:\Program Files\NVIDIA GPU Computing
> Toolkit\CUDA\v9.1\bin/../include\float.h(57): fatal error C1021: プリプロセッサ
> コマンド 'include_next' が無効です。

このパスにある`w32api.h`や`float.h`はGCC(MinGWかな？）向けのヘッダーファイルであり、Visual
C++では使えません。syghさんが指摘されている通り正しく環境構築が行われていないようです。


CC BY-SA 3.0
2018-03-27T21:34:30.117
42682
2018-03-27T21:34:30.117
2020-06-17T08:14:45.997
-1
4236
42672
answer


もう解決しているようですが、一応書いておきます。OPENCVをCUDAでコンパイルするには、  
ダウンロードしたCUDAのバージョンがVisualStudioのバージョンとマッチしているかをまず確認します。現時点のCUDA9.1では15.45までしか対応していません。バージョンが15.5以上になっていたら  
<https://docs.microsoft.com/en-us/visualstudio/productinfo/installing-an-
earlier-release-of-vs2017>  
運が良ければここに15.45のリンクが残ってますので現在のバージョンをアンインストールしてここからダウンロードできるインストーラーを使ってインストールしなおしてください。  
インストールの追加のオプションで英語の言語パックもインストールしておきます。  
ここまで出来たら、コントロールパネルを開いて地域を開き管理タブを選択して下の段のシステムロケールを変更ボタンを押して言語を英語（米国）にします。  
再起動を求められますから素直に再起動してからCUDAを含めた構成でCMAKEをします。  
このやり方でやればCUDAのヘッダーやソースコードをエディタで保存しなおしたりしなくてもコンパイルは通ります。  
できたDLLなどはコードページをもとに戻しても使えます。


CC BY-SA 3.0
2018-04-10T09:07:48.600
43123
2018-04-10T09:07:48.600
28061
42672
answer