UbuntuでC++を実行する

# そういえば

Ubuntuにすっかり馴染んできて、家でもUbuntuを使っているのですが、
Pythonが主流になってからUbuntuを使い始めたので、今までUbuntuでC++を書いたことがないな〜と思い。
実行方法をまとめてみました。
※C++久しぶりに書いたら、セミコロン忘れ地獄発生しました。

会社で必要になったからじゃあないぜ☆

### 前準備

前準備としてホームに`cpp_project`というディレクトリを作成して、そこにコードを保存してきます。

```bash
$ mkdir ~/cpp_project
$ cd ~/cpp_project
```

cmakeのバージョンアップをします。

```bash
$ wget https://github.com/Kitware/CMake/releases/download/v3.13.5/cmake-3.13.5.tar.gz
$ tar -xf cmake-3.13.5.tar.gz
$ cd cmake-3.13.5
$ ./bootstrap && make && sudo make install
$ sudo ldconfig
#確認　インストールしたcmakeと同じバージョンなら成功
$ cmake --version 
cmake version 3.13.5

CMake suite maintained and supported by Kitware (kitware.com/cmake).
```

# 方法１：gccでビルドして実行

一番簡単な実行方法かなと。

## Sample code

```cpp:test.cpp
#include<iostream>

using namespace std;

int main(void){
    int a = 1;
    int b = 2;
    int c = a + b;
    cout << "test:" << c << endl;
    return 0;
}
```

## ビルド&実行

```bash
$ g++ -o test test.cpp #ビルド
$ ./test
test:3
```
`-o`が出力オプションであり、出力する実行ファイル名を指定できます。その後にビルドするCPPファイルを入力します。
すると、同じフォルダに指定した実行ファイル名と同じ実行ファイルができるので、それを実行します。
実行すると、結果が出力されます。

# 方法２：cmakeして実行する

```cmake:CMakeLists.txt
# CMakeのバージョンを設定する
cmake_minimum_required(VERSION 3.13.5)

# プロジェクト名と使用する言語を設定
project(cpp_project CXX)
# 実行ファイルをtest.cppから作成
add_executable(cpp_project test.cpp)
```

この`CMakeLists.txt`を作成した後に、`build`ディレクトリを作成して、その中で`cmake`を実行します。
その後に、`make`することで、``test.out`が作成されるので、それを実行することで結果が得られます。

```bash
$ mkdir build && cd build
$ cmake ..
$ make
$ ./test.out
test:3
```

## ヘッダーがある場合

以下のヘッダーファイルを`test.cpp`と同じディレクトリに
保存してください。

```c++:test.hpp
#include <iostream>
```

さらに、`test.cpp` を以下のように変更します。

```diff:test.cpp
- #include <iostream>
+ #include "test.hpp"

using namespace std;

int main(void){
    int a = 1;
    int b = 2;
    int c = a + b;
    cout << "test:" << c << endl;
    return 0;
}
```

`CMakeLists.txt`は、ヘッダーファイルの`test.hpp`も一緒に書きます。

```diff:CMakeLists.txt
# CMakeのバージョンを設定する
cmake_minimum_required(VERSION 3.13.5)

# プロジェクト名と使用する言語を設定
project(cpp_project CXX)
# 実行ファイルをtest.hppとtest.cppから作成
- add_executable(cpp_project test.cpp)
+ add_executable(cpp_project test.hpp test.cpp)
```

# 方法３：OpenCVなどの他のライブラリを含むビルド＆実行

ここからが、自分的な本題なのですが、OpenCVなどの他のライブラリを参照するプログラムをどうビルドするか書いていきます。

```cpp:img_test.cpp
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>

using namespace std;

int main(void){
    cout << "opencv test" << endl;
    cv::Mat img = cv::imread("img.jpg");
    cv::imshow("img",img);
    cv::waitKey();
    return 0;
}
```

```cmake:CMakeLists.txt
# CMakeのバージョンを設定
cmake_minimum_required(VERSION 3.13.5)

# プロジェクト名と使用する言語を設定
project(cpp_project CXX)
# 実行ファイルをimg_test.cppから作成
add_executable(test3.out img_test.cpp)

# C++のバージョン指定
target_compile_features(test3.out
  PUBLIC cxx_std_11)

# OpenCVのパッケージを探す
find_package(OpenCV REQUIRED)

target_include_directories(test3.out
  PUBLIC ${OpenCV_INCLUDE_DIRS})
target_link_libraries(test3.out
  PUBLIC ${OpenCV_LIBS})
```

# これで

基本的なことはできるようになりました。
あとは、VScode使えるようになりたいですね。


# 参考サイト

[1] [コマンドラインで C++ コードをビルド(コンパイルとか)して実行してみよう](https://qiita.com/phi/items/b6a8073eca1a343204fb)
[2] [CMakeLists.txt から始めよう](https://qiita.com/nonbiri15/items/c77c046f0e10f8140cfe)
[3] [CMakeを使ってみた（2）もう少しまともなプロジェクト](https://www.wagavulin.jp/entry/2011/11/27/222642)
[4] [[Linux][cmake] 最新のcmakeをインストールする方法](https://qiita.com/koara-local/items/9d01c6bb9dd93563b7c6)