追記

日々をアレコレ


2017年10月10日

CS+のプロジェクトをVS Codeでビルドする

Visual Studio Codeには、タスク といって、外部ツールと連携することができるっぽい。そこで、CS+のプロジェクトをVisual Studio Codeからビルドできるようにしてみた。他の手順もあるのかもしれないけど、僕がやった手順をメモしておく。

  1. CS+のプロジェクトフォルダをVS Codeの「フォルダを開く」で開く。
  2. 「Ctrl+Shift+B」を押すと、「ビルドタスクが見つかりません。定義するには'Configure Built Task'(ビルドタスクを構成します)を押してください」みたいなメッセージが出るので、「ビルドタスクを構成します」をクリック。
  3. すると、CS+のプロジェクトフォルダの下に .vscode フォルダができて、その中に tasks.json ができて、VS Codeで開かれた状態になる。

    デフォルトではechoで文字列を出力されるタスクが定義されているので、それを消して以下のようなタスクを定義する。

    {
        "taskName": "Build CS+ Project",
        "type": "shell",
        "command": "CubeSuite+.exe",
        "args":[
            "/npall", "/bb",
            "${workspaceRoot}\\${workspaceRootFolderName}.mtpj"
        ],
        "group": {
            "kind": "build",
            "isDefault": true
        }
    }
    
    • command はCS+のコマンドライン実行ファイルのパスを書けばいいのだけれど、デフォルトでインストールするとフォルダに「Program Files(x86)」とか「Runesas Electronics」とかスペースを含んでしまい、うまくエスケープできなかったので今回は環境設定でパスを設定しておくことで回避。
    • args は引数を設定。
      1. npall はプラグインをロードしない設定。これを指定しないと例外が発生した。
      2. /bb はビルドする設定。
      3. ${workspaceRoot}\\${workspaceRootFolderName}.mtpj はプロジェクトファイルの指定。${workspaceRoot}でプロジェクトのルートフォルダのパスを、 ${workspaceRootFolderName}でプロジェクトのルートフォルダの名前を取得して、プロジェクトファイル名としている。

この設定があると、次回以降「Ctrl+Shift+B」でビルドが実行される。一応、エラーとかワーニングもターミナルに表示されるので、ビルドの確認だけならCS+なしで可能に。

(2017/10/11追記) スペースがエスケープできない件については、MS-DOSな8.3形式のパス名で解決できるらしい。8.3形式のパス名を取得するには、コマンドプロンプトで親ディレクトリまで移動して、dir /x を実行するといいらしい。


2017年10月09日

UWPでOpenCVを使う準備

画像処理を使ってロボットの操作とかをしてみようということで、その準備としてUWPからOpenCVを使うための準備を忘れないようにメモ。

まず、OpenCVの準備から。基本的には、 Visual Studio 2017にOpenCV3.2.0とopencv_contribを導入する方法 - Qiita にある通りに、次の手順で進める。

  1. CMakeのインストール。

    Download | CMake から最新のものをダウンロードする。僕の場合、Windows 64bit版のインストーラを使ってインストール。

  2. OpenCVのソースを準備

    Releases · opencv/opencv · GitHub からVisual C++向け(opencv-x.x.x-vc14.exe)をダウンロードする。今回は、opencv-3.3.0-vc14.exe をダウンロードして、適当なフォルダ(例えば、C:\opencv)に展開。

  3. OpenCV contribのソースを準備

    Releases · opencv/opencv_contrib · GitHub からダウンロード。 今回は本体と合わせて3.3.0のソースをダウンロードして、本体の展開先から参照しやすい場所(例えば、C:\opencv\contrib)に展開。

  4. CMakeの実行

    参照ページのCMakeの実行 の項目の通り、CMakeを実行して、以下の順に進める。

    1. ソースパスは、本体の展開先のパスを指定。
    2. 出力先は適当に指定(例えば、C:\opecv\build)
    3. ビルド用のプロジェクトは Visual Studio 2017の対象アーキテクチャを指定。32bitなら「Visual Studio 15 2017」、64bitなら「Visual Studio 15 2017 Win64」、ARMなら「Visual Studio 15 2017 ARM」を選択。
    4. 「OPENCV_EXTRA_MODULE_PATH」にOpenCV contribの展開先にある modules フォルダ(例えば、C:\opencv\contrib\modules`` を押して、「Configure」をクリック。すると、先頭にOpenCV contribに含まれるパッケージが選択できるようになる。
    5. 利用するモジュールを選択して、「Configure」をクリックして、「Configure done」と表示されるまで待つ。
    6. 「Generate」をクリックして、ソースファイルを生成する。
    7. 「Open Project」をクリックして、Visual Studio 2017でソリューション(出力先としてした中に OpenCV.sln がある)を開く。
  5. ビルドする。

    Visual Studio 2017で生成されたソースをビルドする。生成は、ソリューション内の CMakeTargets/Install プロジェクトをビルドする。

    これで、VC++から参照するインクルードファイル、libファイル、および、dllファイルが生成される。

    • インクルードファイルは、 (出力先)/install/include フォルダにある。
    • libファイルは、 (出力先)/install/(アーキテクチャ)/vc15/lib フォルダにある。
    • dllファイルは、 (出力先)/install/(アーキテクチャ)/vc15/bin フォルダにある。

以上で、OpenCVを利用するための準備は完了。次に実際に利用するための手順。とりあえず、OpenCVについては、C++/CLIを使って記述して、アプリケーションはC#で記述するという方針でするための手順。

  1. OpenCVを利用するためのプロジェクトは、「Visual C++ > Windows ユニバーサル > Windows ランタイムコンポーネント(ユニバーサルWindows)」のテンプレートを利用する。

    1. C++プロジェクトの設定で、「C/C++ > 全般 > 追加のインクルードディレクトリ」として、ビルドしてできたインクルードファイルのあるフォルダを追加する。
    2. C++プロジェクトの設定で、「リンカー > 全般 > 追加のライブラリディレクトリ」として、ビルドしてできたlibファイルのあるフォルダを追加する。
    3. 参照したいlibファイルの設定は、C++プロジェクトの設定で、「リンカー > 入力 > 追加の依存ファイル」に設定するか、あるいは、OpenCVのAPIを呼び出すソースに以下のような記述をする。

      #if _DEBUG
      #define CV_EXT "d.lib"
      #else
      #define CV_EXT ".lib"
      #endif
      #pragma comment(lib, "(参照するlibファイル名)" CV_EXT)
      

      こうすることで、デバッグとリリースのそれぞれで必要なlibファイルの読み込みは可能。

1.アプリケーションのプロジェクトは、とりあえず、C++と同一のソリューション内に作成する。

1. 参照設定で、C++のプロジェクトを参照する。
1. プロジェクト直下に、DLLフォルダを作成し、その中にさらに「x64」や「x86」、「ARM」といったアーキテクチャ名のフォルダを作成し、それぞれに「Debug」と「Release」フォルダを作成。それぞれのアーキテクチャ、ビルド設定に応じて、利用するdllファイルをコピーする。Debug向けのdllファイルは末尾が「d.dll」となっているもの。
1. プロジェクトのビルドイベントの設定で、ビルド後のイベントコマンドラインとして ``copy $(ProjectDir)DLL\$(PlatformName)\$(ConfigurationName)\*.dll $(ProjectDir)$(OutDir)`` を設定する。これで、アーキテクチャやビルド設定が変わっても、必要なDLLファイルだけをコピーして実行可能に。(未確認だけど、リモートコンピュータなどでも多分問題ないはず)


追記