Windows環境でC++プロジェクトのビルド環境を整える

## 概要

発端は空を検知して色々やりたいなと思ったのがきっかけです。ディープラーニングをメインに調査しているものの機械学習ではないものもありました。

今回見つけたものはC++のプロジェクト。
普段、C++を触ることがあまりなく、ビルド環境などは構築したことがなかったので環境構築の過程をメモする意味でここに色々と書いておこうと思います。
（C++関連はビルド手順やらなにやら、かなり基礎から知らないとならないのでだいぶ難儀しました…）

今回は以下のリポジトリのC++プロジェクトのビルドを試みます。
（**結論から言うと、プロジェクトはLinuxをターゲットにしていてWindowsでは動かなかったです。なのでこのプロジェクトの動作を目掛けて来た人は以下の記事はまったくの無意味です；**）

- [hunterlew/sky-detector - GitHub](https://github.com/hunterlew/sky-detector)


## C++プロジェクトをビルドするには

C++プロジェクトをビルドするには環境の情報を取得し、適切なビルドパラメータなどを設定しないとなりません。
しかしこれらをいちいち手動で設定するのは骨が折れますし、環境ごとにそれを調査して、なんていうのは生産性がありません。

ということで登場するのが**CMake**です。


### CMake

本プロジェクトをビルドするために`cmake`コマンドが必要になります。
デフォルトではインストールされていないのでこれをインストールする必要があります。
CMakeのインストールについてはたくさん記事があるのでそちらを参照ください。

**CMake**は**クロスプラットフォームなC++プロジェクトを開発するのに欠かせないツール**のようです。
CMakeLists.txtに色々なバージョンやら設定やらを記述しておき、それを`cmake`コマンドで実行してやることでプロジェクトの依存関係をビルドを行っているプラットフォームに適した形で設定ファイルを生成してくれる、そいうツールのようです。

- [CMake download](https://cmake.org/download/)


#### CMakeでハマった点

最初に自分の環境で`cmake`を実行したところ以下のようなエラーが表示されて先に進めませんでした。

```
CMake Error at CMakeLists.txt:2 (project):
  Failed to run MSBuild command:

    MSBuild.exe

  to get the value of VCTargetsPath:

-- Configuring incomplete, errors occurred!
See also "D:/MyDesktop/C++Projects/CMakeTest/CMakeFiles/CMakeOutput.log".
```

調べていくと対象のコンパイラが見つからない、という主旨のエラーだったようです。  
ということで必要なコンパイラを準備します。


##### 1. コンパイラの準備

以下のようなコンパイラが見つからないというエラーが出たのでその対処法。

```
No CMAKE_C_COMPILER could be found.
No CMAKE_CXX_COMPILER could be found.
```

以下の記事を見るに、デフォルトではVisual Studioの環境にC++のコンパイラがインストールされていないのが原因ぽいです。

[CMakeLists.txtでのCMakeエラー：30（プロジェクト）：CMAKE_C_COMPILERが見つかりませんでした - it-swarm.dev](https://www.it-swarm.dev/ja/c%2B%2B/cmakeliststxt%E3%81%A7%E3%81%AEcmake%E3%82%A8%E3%83%A9%E3%83%BC%EF%BC%9A30%EF%BC%88%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%EF%BC%89%EF%BC%9Acmakeccompiler%E3%81%8C%E8%A6%8B%E3%81%A4%E3%81%8B%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%81%A7%E3%81%97%E3%81%9F/1055475590/)

なので、この記事に従って新しくインストールしました。
Visual Studio Installerというアプリがあるのでそこから色々モジュールを追加することができます。

該当アプリを立ち上げると以下のような画面になります。
ここから「**変更**」ボタンを押してモジュールのインストール画面に移動します。
![20200703140601.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5616/776ab211-8d73-c318-a7a1-81fa8667b4fc.jpeg)


すると以下のような画面になります。ひとまずどれが必要か分からなかったので、追加で2点（赤いラインが引いてあるやつ）をインストールしました。
![20200703140709.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5616/a1d413f6-430e-9372-8fce-bc60a27a36fc.jpeg)

これを行ったら無事、`cmake`が動くようになりました。


##### 2. そもそもCMakeが古かった

ちなみに、ノートPCとデスクトップPCの2台を持っているんですが、デスクトップPCのほうはこれをしても動きませんでした。
が、蓋を開けてみたらなんのことはない、**CMake自体のバージョンが古かっただけ**、というオチ。
（Visual Studio 2019を使っているけど、2017くらいのバージョンを使っていた）

なので、CMake自体がそもそも新しいかはチェックしたほうがいいかもしれません。


##### 3. Could NOT find Boostと言われてコケる

正確には以下のエラー。

```
$  Could NOT find Boost (missing: Boost_INCLUDE_DIR)
```

こちらは、Boostというライブラリを別途インストールしないとならないようです。

BoostはC++のライブラリで、[Wikipedia](https://ja.wikipedia.org/wiki/Boost_C%2B%2B%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA:)から引用すると以下のように説明されています。

> Boost （ブースト）とは、C++の先駆的な開発者のコミュニティ、およびそのコミュニティによって公開されているオープンソースのソフトウェアライブラリのことを指す。

- [【Windows】BoostをビルドしてCMakeで使用する。 - アプリの備忘録](https://matsudamper.hatenablog.com/entry/2019/04/20/082155)
- [Boostライブラリのビルド方法 - boostjp : Boost日本語情報サイト](https://boostjp.github.io/howtobuild.html)


インストール後、Boostが見つからない旨のエラーが出ますがCMakeLists.txtに以下を追加すればOKでした。

```cmake
... 前略 ...
# ↓これを追加
SET(Boost_INCLUDE_DIR "Pash/to/boost")

find_package(Boost REQUIRED)
... 後略 ...
```

##### 4. OpenCVがないと言われてコケる

```
CMake Error at CMakeLists.txt:27 (find_package):
  By not providing "FindOpenCV.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "OpenCV", but
  CMake did not find one.

  Could not find a package configuration file provided by "OpenCV" with any
  of the following names:

    OpenCVConfig.cmake
    opencv-config.cmake

  Add the installation prefix of "OpenCV" to CMAKE_PREFIX_PATH or set
  "OpenCV_DIR" to a directory containing one of the above files.  If "OpenCV"
  provides a separate development package or SDK, be sure it has been
  installed.
```

ということでOpenCVをインストール。  
自分の環境はWSL（Windows上で動くLinux）だったのでUbuntu向けのインストールをします。

- [OpenCV 4.3.0 (最新版) のビルドとインストール，CUDA 対応可能（ソースコードを使用）（Ubuntu 上）](https://www.kkaneko.jp/tools/ubuntu/ubuntu_opencv_buildout.html)
- [OpenCVの本当に動くインストール手順 - Qiita](https://qiita.com/usk81/items/98e54e2463e9d8a11415)


###### CMakeLists.txtに追記

上記の方法でOpenCVを無事にインストールできたのですが、cmakeコマンドからこれが見つけられないためにCMakeが失敗しました。  
結論から言うと、以下のようにOpenCVの`.cmake`ファイルがあるディレクトリを指定してやることで解決しました。

```
set(OpenCV_DIR "/Path/to/cmake/opencv4/")

find_package( OpenCV REQUIRED )
```

パスはインストール環境などによって異なると思うのでそこは適宜変えてください。

参考までに、自分のインストール時のログではこのように出力されていました。

```
-- Installing: /usr/local/share/OpenCV/OpenCVConfig.cmake
```

```console
$ cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules ..
```


##### 5. Macでの問題

Macで実行したところ、最後の`make`で以下のようなエラーが発生しました。

```console
clangclang: : clang: errorerror: : unsupported argument 'libomp' to option 'fopenmp='unsupported argument 'libomp' to option 'fopenmp='
```

- [技巧をMac環境で使う - Qiita](https://qiita.com/ligerbolt/items/6e27c882838fdcc1a490)
- [MacOSで/system以下のread only filesystemにアクセスしたい時（Catalina) - Qiita](https://qiita.com/Orangelinux/items/387c60f90652be085131)
- [初心者向け　MacでOperation not permittedの解決方法 - Qiita](https://qiita.com/iwaseasahi/items/9d2e29b02df5cce7285d)