[C++ビルド]Linuxerがwindowsでビルド環境を構築するのに、めちゃ苦戦したのでまとめる。

# こんな状態の人向け
あ～、Linuxで作った認識のライブラリをWindowsでも実行できるように環境作りてぇな～
Visual studioのGUIうっとおしいから、CmakeとMsbuildでやってみるかぁ～
なんだこれ、、、どうすればばいいんだよ。ぐぐっても情報あんまりひっかかんねーぞ。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205071/868f890b-86e9-724d-b0b3-a74171f6e330.png)

# ゴール
opencvでwindowが表示されるコードを、msbuildとcmakeで構築します。
こんなのを表示されたらOK。ついでに、コマンドラインにはHello!って文字も表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205071/3b88c168-e864-cc6d-119d-6982bc0a8b16.png)

# 手順概要
1. ツールをインストール（msbuild cmake）
2. サンプルコード、cmakeを書く
2. ビルド、実行用のbatファイルを書く
2. 実行する


# 1. ツールをインストール（msbuild cmake）
超分かり易いインストール方法を書いてる人のモノを参考にしましょう！
msbuild等 : https://qiita.com/piacerex/items/4d6d234dc0fb66bbb592
cmake : https://qiita.com/East_san/items/aff4f7907aedabe6da47

# 2. サンプルコード、cmakeを書く

dir構成はこんな感じ。
opencvを使うのでここから好きなバージョンをダウンロードして、適当に突っ込みましょう。（僕の場合はexternal/opencv-3.4.4以下に配置）
https://opencv.org/releases/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205071/f9405509-1d52-c637-ef67-9929bc68ccaf.png)

```c++:main.cpp
#include <stdio.h>
#include "hello.hpp"
#include <opencv2/opencv.hpp>

int main()
{
	cv::Mat image(cv::Size(200, 200), CV_8UC1);

	hello();
	cv::imshow("images", image);
	
	cv::waitKey(0);
	return 1;
}
```

```c++:hello.cpp
#include <iostream>
#include "hello.hpp"

void hello() {
    std::cout << "Hello!" << std::endl;
}
```
```c++:hello.hpp
#ifndef HELLO_H
#define HELLO_H

void hello();

#endif
```

Cmakeその他のことはここを見ましょう。
https://qiita.com/janus_wel/items/a673793d448c72cbc95e

message()を使うとログを出すことができるので、
バグった場合は利用しましょう。

```c++:CMakeLists.txt
cmake_minimum_required(VERSION 2.8)

# PROGNAME変数にhelloをセット
set(PROGNAME hello)

include_directories(./external/opencv-3.4.4/build/include/)

link_directories(./external/opencv-3.4.4/build/x64/vc15/lib/)

add_executable(${PROGNAME} main.cpp hello.cpp)

message("[INFO] debug log -----------")
message("${PROGNAME}")

#3rd libの管理をする変数を作成して、追加
set(list_lib_3rd)
list(APPEND list_lib_3rd 
../external/opencv-3.4.4/build/x64/vc15/lib/opencv_world344
)

# 最後にリンク
target_link_libraries(${PROGNAME}
                    ${list_lib_3rd}
                    )
```

# 3. ビルド、実行用のbatファイルを書く
x64＆Releaseとしてビルドするので、cmakeの引数に追記するのを忘れずに。
cmakeやmsbuild.exeのpathは各自調べておきましょう。

```bat:msbuild.bat
mkdir msbuild
cd msbuild

REM x64 Relasseはここで指定っぽい。
call "C:\Program Files\CMake\bin\cmake.exe" ../ ^
     -DCMAKE_GENERATOR_PLATFORM=x64 -DCMAKE_BUILD_TYPE=Release

REM ここで、Relesaeの指定も必要っぽい。
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\MSBuild.exe" ^
                                                            "hello.vcxproj" /p:Configuration=Release
  
```

実行時にDLLのパスが通ってないとエラーになるので、指定しておきましょう。

```bat:run.bat
set OPENCV_PATH=.\external\opencv-3.4.4\build\x64\vc15\bin\
set PATH=%OPENCV_PATH%;%PATH%
call "./msbuild/release/hello.exe"

```

# 4.実行する
1. msbuild.batをダブルクリック
1. run.batをダブルクリック

# おわり
こんな環境を構築するのにも、丸1日かかっちまったぜ・・・
会社の人には言えない言えない。(・ｘ・）

あと、日本語のコメントはエラーの発生源だからマジで注意。

# 参考になりそうな情報はここら辺が参考になりそう。
* cmakeビルドオプション関係
https://www.wagavulin.jp/entry/2011/11/27/222650
* make -> cmakeに書き換える
https://www.hiroom2.com/2016/09/07/makefile%E3%82%92cmakelists-txt%E3%81%AB%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B/
* 共有ライブラリの作成関係
https://mijinc0.github.io/blog/post/20190530_cpp_library/
https://theolizer.com/cpp-school3/cpp-school3-8/
https://www.qoosky.io/techs/814fda555d