Windows上で Qt と VTK (QVTK) サポートな環境構築メモ (2019/04版)

# はじめに

Windows, Visual Studio 2017でQt，VTK (with Qt)サポート + Python 3な開発環境構築の記録用メモ．
OpenCV, PCL, Open3D, TensorFlowが使える環境を構築，ライブラリは原則 `C:\lib` 以下に配置．

TensorFlow 1.13.1にあわせるため，CUDA 10.0，cuDNN 7.4，Python 3.6をインストールする．
https://www.tensorflow.org/install/source
（Windows向けのページ https://www.tensorflow.org/install/source_windows は情報が古そう）
CUDAが最新のVisual Studioに対応しているか不安なのでVS2017を使用する．

[1年前の記事](https://qiita.com/n_chiba_/items/0658e8f3a4b4c094df51) ，[2年前の記事](https://qiita.com/n_chiba_/items/ea0bc4b4b99ac14ef46d) のアップデートです．
引き続き http://unanancyowen.com/pcl191 (PCL 1.9.1) を大いに参考にさせて頂きました．ありがとうございます．

本記事での `> 何かコマンド` は，PowerShell上での操作を意味します．



# 導入するもの
- インストーラー使用
  - Visual Studio Community 2017 15.9.11
  - Anaconda 2019.03 for Windows
  - CUDA 10.0
  - cuDNN 7.4.2 for CUDA 10.0
  - Qt 5.12.3
  - Git for Windows 2.21.0
  - CMake 3.14.3
  - HDF5 1.10.5
  - Microsoft MPI 10.0.12498.5, Microsoft MPI SDK 10.0.12498.5
  - OpenNI 2.2.0.33 (x64) Beta
  - (MATLAB 2018b) もし使うなら
- パッケージマネージャー使用，ちょっと注意が必要
  - TensorFlow 1.13.1
- ソースから導入
  - bzip2 1.0.6 （ソースのみ）
  - zlib 1.2.11 （ソースのみ）
  - Boost 1.70.0
  - FreeGLUT 3.0.0
  - GLEW 2.1.0
  - Eigen 3.3.7
  - VTK 8.2.0
  - FLANN 1.9.1
  - QHull 2018.0.1 (7.3.0)
  - OpenCV 4.1.0
  - PCL 1.9.1
  - Bullet 2.88
  - Open3D 0.6.0



# システム構成（参考）

|  要素 | スペック |
|---:|:---|
| CPU | Intel Core i9-9900K           |
| RAM | 64GB                          |
|  OS | Windows 10 Pro (64bit)        |
| GPU | NVIDIA GeForce GTX 2080 Ti x2 |



# 導入手順

## インストーラー使用

- Visual Studio Community 2017 15.9.11
  - https://www.visualstudio.com/ja/vs/older-downloads/
  - 以下を追加で選択
    - ワークフロー/C++によるデスクトップ開発
    - ワークフロー/C++によるゲーム開発
    - 個別のコンポーネント/画像と3Dモデルのエディター
    - 言語パック/英語
    - 言語パック/日本語

- Anaconda 2019.03 for Windows
  - https://www.anaconda.com/distribution/
  - `C:\Python\Anaconda3`にインストール
  - Python 3.7がインストールされるので，一応3.6にダウングレード
      - `> conda install python=3.6`
      - Python 3.6.8 にダウングレードされる

- CUDA 10.0
  - https://developer.nvidia.com/cuda-10.0-download-archive

- cuDNN 7.4.2 for CUDA 10.0
  - https://developer.nvidia.com/rdp/cudnn-download
  - 解凍したファイルを C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0 にコピー

- Qt 5.12.3
  - https://www.qt.io/download
  - インストーラーではQt 5.12.3を選択
  - 環境変数 `QT_DIR` を `C:\Qt\5.12.3\msvc2017_64\lib\cmake\` に設定
  - PATH に `C:\lib\Qt\install\bin\` を追加

- Git for Windows 2.21.0
  - https://gitforwindows.org/

- CMake 3.14.3
  - https://cmake.org/

- HDF5 1.10.5
  - https://www.hdfgroup.org/downloads/hdf5
  - ユーザー登録が必要なので注意
  - `hdf5-1.10.5-Std-win10_64-vs15`を選択
  - 環境変数 `HDF5_ROOT` を `C:\Program Files\HDF_Group\HDF5\1.10.5\` に設定

- Microsoft MPI 10.0.12498.5, Microsoft MPI SDK 10.0.12498.5
  - https://docs.microsoft.com/en-us/message-passing-interface/microsoft-mpi

- OpenNI 2.2.0.33 (x64) Beta
  - https://structure.io/openni

- (MATLAB 2018b) もし使うなら



## TensorFlow 1.13.1
（参考: https://www.tensorflow.org/install ）

1. AnacondaでTensorFlow用の環境を作る
  1. `> conda create -n tensorflow pip python=3.6`
  1. `> activate tensorflow`
1. `> pip install --ignore-installed --upgrade tensorflow-gpu`
1. TensorFlowが動作することを確認．まずPythonインタプリタ起動
  1. `> python`
  1. インタプリタ上で以下を走らせてみる

  ```
  > import tensorflow as tf
  > hello = tf.constant('Hello, TensorFlow!')
  > sess = tf.Session()
  > print(sess.run(hello))
  ```

  `b'Hello, TensorFlow!'`が出ていればとりあえずOK．`(Ctrl)+Z`で抜ける



## bzip2 1.0.6 （ソースのみ）

1. `C:\lib\bzip2` を作成
1. https://sourceforge.net/projects/bzip2/ からソースをダウンロードして`C:\lib\bzip2\src`に解凍



## zlib 1.2.11 （ソースのみ）

1. `C:\lib\zlib` を作成
1. http://zlib.net/ からソースをダウンロードして`C:\lib\zlib\src`に解凍



## Boost 1.70.0
（参考: https://gist.github.com/UnaNancyOwen/d879a41710e9c05025f8 ）

1. `C:\lib\Boost\`を作成
1. http://www.boost.org/users/download/ からソースをダウンロード，`C:\lib\Boost\src`に解凍
1. VS 2017 用 x64 Native Tools コマンド プロンプトを起動，以降はこのプロンプト上で実行
1. `> cd C:\lib\Boost\src`
1. `> bootstrap.bat`
1. project-config.jamに以下を追記（Boost.MPIとPython3.6用のBoost.PythonとBoost.Numpyを導入）
  
    ```
    using mpi ;
    
    using python : 3.6 : "C:/Python/Anaconda3/python.exe" : "C:/Python/Anaconda3/include" : "C:/Python/Anaconda3/libs"  : <address-model>64 ;
    ```

1. `> b2.exe toolset=msvc-14.1 address-model=64 --build-dir="C:/lib/Boost/build" -s BZIP2_SOURCE="C:/lib/bzip2/src" -s ZLIB_SOURCE="C:\lib\zlib\src" -s NO_ZLIB=0 -s NO_BZIP2=0 -j7`
（-jで並列数指定，コア数以下に設定すると良さげ．）
1. `> b2.exe toolset=msvc-14.1 address-model=64 --build-dir="C:/lib/Boost/build" install --prefix="C:/lib/Boost/install"`
1. 環境変数 `BOOST_ROOT` を `C:\lib\Boost\install\` に設定



## FreeGLUT 3.0.0

1. `C:\lib\Freeglut` を作成し移動
1. http://freeglut.sourceforge.net/ からソースをダウンロード，C:\lib\Freeglut\srcに解凍
1. CMake (Visual Studio 15 2017, x64)
    - src: C:\lib\Freeglut\src
    - build: C:\lib\Freeglut\build
1. Configure （変更点のみ．各自の環境に合わせて確認する）
    - CMAKE_INSTALL_PREFIX: C:/lib/Freeglut/install/
    - INSTALL_PDB: no
1. Generate & Open Project
1. DebugでALL_BUILD, INSTALLを順にビルド
1. ReleaseでALL_BUILD, INSTALLを順にビルド
1. 環境変数 `GLUT_ROOT_PATH` を `C:\lib\Freeglut\install\` に設定
1. PATH に `C:\lib\Freeglut\install\bin\` を追加



## GLEW 2.1.0

1. `C:\lib\GLEW` を作成
1. http://glew.sourceforge.net/ からソースをダウンロード，C:\lib\Qt\GLEW\srcに解凍．
    GitHubのリポジトリには含まれていないファイルがあるので必ずzipで．
1. C:\lib\GLEW\srcに移動
1. CMake (Visual Studio 15 2017, x64)
    - src: C:\lib\GLEW\src\build\cmake
    - build: C:\lib\GLEW\build
1. Configure （変更点のみ．各自の環境に合わせて確認する）
    - CMAKE_INSTALL_PREFIX: C:/lib/GLEW/install/
1. Generate & Open Project
1. DebugでALL_BUILD, INSTALLを順にビルド
1. ReleaseでALL_BUILD, INSTALLを順にビルド
1. 環境変数 `GLEW_ROOT` を `C:\lib\GLEW\install\` に設定
1. PATHに `C:\lib\GLEW\install\bin\` を追加



## Eigen 3.3.7
（参考: https://gist.github.com/UnaNancyOwen/08e5a9b8f5979ed0077c ）

1. `C:\lib\Eigen\` を作成し移動
1. `> git clone https://github.com/eigenteam/eigen-git-mirror.git src`
1. `> cd src`
1. `> git checkout 3.3.7`
1. CMake (Visual Studio 15 2017, x64)
    - src: C:\lib\Eigen\src
    - build: C:\lib\Eigen\build
1. Configure （変更点のみ．各自の環境に合わせて確認する）
    - CMAKE_INSTALL_PREFIX: C:/lib/Eigen/install/
1. Generate & Open Project
1. DebugでALL_BUILD, INSTALLを順にビルド
1. ReleaseでALL_BUILD, INSTALLを順にビルド
1. 環境変数 `EIGEN_ROOT` を `C:\lib\Eigen\install\` に設定



## VTK 8.2.0
（参考: https://gist.github.com/UnaNancyOwen/9d16060714ba9b28f90e ）

1. `C:\lib\VTK\` を作成し移動
1. `> git clone https://github.com/Kitware/VTK.git src`
1. `> cd src`
1. `> git checkout v8.2.0`
1. CMake (Visual Studio 15 2017, x64)
    - src: C:\lib\VTK\src
    - build: C:\lib\VTK\build
1. Configure （変更点のみ．各自の環境に合わせて確認する）
    - CMAKE_DEBUG_POSTFIX: \_d
    - BUILD_TESTING: no
    - CMAKE_CXX_MP_FLAG: yes
    - CMAKE_INSTALL_PREFIX: C:/lib/VTK/install/
    - VTK_GROUP_Qt: yes
1. Generate & Open Project
1. DebugでALL_BUILD, INSTALLを順にビルド
1. ReleaseでALL_BUILD, INSTALLを順にビルド
1. 環境変数 `VTK_DIR` を `C:\lib\VTK\install\` に設定
1. PATHに `C:\lib\VTK\install\bin\` を追加



## FLANN 1.9.1
（参考: https://gist.github.com/UnaNancyOwen/1e3fced09e4430ad0b7b ）

1. `C:\lib\Flann\` を作成し移動
1. `> git clone https://github.com/mariusmuja/flann.git src`
1. `> cd src`
1. `> git checkout 1.9.1`
1. `src\cpp\flann\algorithms\kdtree_cuda_3d_index.cu` の45行目の次に`#include <thrust/gather.h>`を追加．
1. CMake (Visual Studio 15 2017, x64)
    src: C:\lib\Flann\src
    build: C:\lib\Flann\build
1. Configure （変更点のみ．各自の環境に合わせて確認する）
    - CMAKE_DEBUG_POSTFIX: \_d
    - CMAKE_INSTALL_PREFIX: C:/lib/GLEW/install
    - BUILD_CUDA_LIB: yes
    - BUILD_DOC: no
    - BUILD_MATLAB_BINDINGS: no
    - BUILD_PYTHON_BINDINGS: no
    - BUILD_EXAMPLES: no
    - BUILD_TESTS: no
1. Generate & Open Project
1. DebugでALL_BUILD, INSTALLを順にビルド
1. ReleaseでALL_BUILD, INSTALLを順にビルド
1. 環境変数 `FLANN_ROOT` を `C:\lib\Flann\install\` に設定
1. PATHに `C:\lib\Flann\install\bin\` を追加



## QHull 2018.0.1 (7.3.0)
（参考: https://gist.github.com/UnaNancyOwen/ffbe6b05ee0101620d3c ）

1. `C:\lib\Qfull\` を作成し移動
1. `> git clone https://github.com/qhull/qhull.git src`
1. `> cd src`
1. `> git checkout v7.3.0`
1. CMake (Visual Studio 15 2017, x64)
    - src: C:\lib\Qfull\src
    - build: C:\lib\Qfull\build
1. Configure （変更点のみ．各自の環境に合わせて確認する）
   - CMAKE_DEBUG_POSTFIX: \_d
   - CMAKE_INSTALL_PREFIX: C:/lib/Qfull/install/
1. Generate & Open Project
1. DebugでALL_BUILD, INSTALLを順にビルド
1. ReleaseでALL_BUILD, INSTALLを順にビルド
1. 環境変数 `QHULL_ROOT` を `C:\lib\Qfull\install\` に設定
1. PathにC:\lib\Qfull\install\binを追加



## OpenCV 4.1.0
（参考: http://qiita.com/emakryo/items/5e2c79c2a18e60dd212f ）
（参考: http://qiita.com/fukushima1981/items/fae7d40123bfdf426624 ）

1. `C:\lib\OpenCV\` を作成し移動
1. `> git clone https://github.com/Itseez/opencv.git src`
1. `> cd src`
1. `> git checkout 4.1.0`
1. `> cd ..`
1. `> git clone https://github.com/Itseez/opencv_contrib.git src_contrib`
1. `> cd src_contrib`
1. `> git checkout 4.1.0`

1. CMake (Visual Studio 15 2017, x64)
    - src: C:\lib\OpenCV\src
    - build: C:\lib\OpenCV\build
1. Configure （変更点のみ．各自の環境に合わせて確認する，CUDA_ARCH_BINはVisual Studio上のNsightからSystem Infoで確認するのが楽）
    - CMAKE_INSTALL_PREFIX: C:/lib/OpenCV/install/
    - CUDA_ARCH_BIN: 7.5
    - BUILD_opencv_python3: no
    - WITH_QT yes
    - WITH_OPENNI2: yes
    - WITH_OPENGL: yes
    - WITH_CUDA: yes
    - OPENCV_EXTRAMODELUES_PATH: C:/lib/OpenCV/src_contrib/modules/
    - EIGEN_INCLUDE_PATH: C:/lib/Eigen/install/include/eigen3/
    - OPENCV_ENABLE_NONFREE: yes
1. Generate & Open Project
1. DebugでALL_BUILD, INSTALLを順にビルド
1. CMakeで再度Configure（Pythonのデバッグビルドを持っていないため，Pythonバインディングはリリースのみでビルドする）
    - BUILD_opencv_python3: yes
1. Generate & Open Project
1. ReleaseでALL_BUILD, INSTALLを順にビルド
1. 環境変数 `OPENCV_DIR を C:\lib\OpenCV\install\` に設定
1. PATHに `C:\lib\OpenCV\install\bin\` と `C:\lib\OpenCV\install\x64\vc15\bin\` を追加



## PCL 1.9.1
（参考: https://gist.github.com/UnaNancyOwen/59319050d53c137ca8f3 ）

1. `C:\lib\PCL\` を作成し移動
1. `> git clone https://github.com/PointCloudLibrary/pcl.git src`
1. `> cd src`
1. `> git checkout pcl-1.9.1`
1. io\src\ensenso_grabber.cppの464行目と509行目の `uint` を `unsigned int` に変更
1. visualization\include\pcl\visualization\impl\pcl_visualizer.hppの1431行目，1467行目，1543行目 `am_it->second.actor->GetMapper ()->ImmediateModeRenderingOff ();` をそれぞれコメントアウト
1. https://github.com/PointCloudLibrary/pcl/pull/2942 を参考に， `segmentation\include\pcl\segmentation\supervoxel_clustering.h` の528行目を `friend void boost::checked_delete<> (const typename pcl::SupervoxelClustering<PointT>::SupervoxelHelper *) BOOST_NOEXCEPT;` に修正
1. CMake (Visual Studio 15 2017, x64)
    - src: C:\lib\PCL\src
    - build: C:\lib\PCL\build
1. Configure （変更点のみ．各自の環境に合わせて確認する）
    - CMAKE_INSTALL_PREFIX: C:/lib/PCL/install/
    - FLANN_LIBRARY_DEBUG: C:/lib/Flann/install/lib/flann_cpp_s_d.lib
    - BUILD_CUDA: yes
    - BUILD_GPU: yes
    - BUILD_examples: yes
    - BUILD_cuda_io: yes
    - BUILD_gpu_kinfu: yes
    - BUILD_gpu_kinfu_large_scale: yes
    - BUILD_gpu_surface: yes
    - BUILD_gpu_tracking: yes
    - CUDA_ARCH_BIN: 7.5
1. Generate & Open Project
1. DebugでALL_BUILD, INSTALLを順にビルド
1. ReleaseでALL_BUILD, INSTALLを順にビルド
1. 環境変数 `PCL_ROOT` を `C:\lib\PCL\install\` に設定
1. PATHに `C:\lib\PCL\install\bin\` を追加



## Bullet 2.88

1. `C:\lib\Bullet\` を作成し移動
1. `> git clone https://github.com/bulletphysics/bullet3.git src`
1. `> cd src`
1. `> git checkout 2.88`
1. CMake (Visual Studio 15 2017, x64)
    - src: C:\lib\Bullet\src
    - build: C:\lib\Bullet\build
1. Configure
    - CMAKE_INSTALL_PREFIX: C:/lib/Bullet/install/
    - LIBRARY_OUTPUT_PATH: C:/lib/Bullet/install/lib/
    - INSTALL_LIBS: yes
    - USE_MSVC_RUNTIME_LIBRARY_DLL: yes
    - BUILD_BULLET2_DEMOS: no
    - BUILD_CPU_DEMOS: no
    - BUILD_OPENGL3_DEMOS: no
    - BUILD_UNIT_TESTS: no
1. Generate & Open Project
1. DebugでALL_BUILD, INSTALLを順にビルド
1. ReleaseでALL_BUILD, INSTALLを順にビルド
1. 環境変数 `BULLET_ROOT` を `C:\lib\Bullet\install\lib\cmake\` に設定



## Open3D 0.6.0
（参考: http://open3d.org/docs/compilation.html ）

1. `C:\lib\Open3D\` を作成し移動
1. `> git clone --recursive https://github.com/intel-isl/Open3D src`
1. `> cd src`
1. `> git checkout v0.6.0`
1. CMake (Visual Studio 15 2017, x64)
    - src: C:\lib\Open3D\src
    - build: C:\lib\Open3D\build
1. Configure
    - CMAKE_INSTALL_PREFIX: C:/lib/Open3D/install/
1. Generate & Open Project
1. DebugでALL_BUILD, INSTALLを順にビルド
1. ReleaseでALL_BUILD, INSTALLを順にビルド
1. Releaseでinstall-pip-packageをビルド（他の仮想環境にインストールしたい場合には適宜その環境で実行）



# おわりに
今回で三度目です．
一年間でどのライブラリがどれくらい更新されているか分かるので楽しいんですが，最近は環境構築とかに情熱を燃やせなくなってきました．．．