netCDF4-C++をvisual studio で使う

## はじめに

気象データの解析は主にFortranが使用されてきました。最近はPythonもよく見かけます。一方、C/C++で解析をしている人はあまり見かけません。自分はC++が好きなので、C++でnetCDFデータの解析ができるように環境設定をしたのですが、情報が全然なくて困ったため、記録として残します。

それと、WSL使っちゃえば（多分）楽なんですけど、Visual Studioでやりたいことがあったので、Visual Studioで使えるようにしてみます。

## 環境・使うもの
- Windows 11
- Visual Studio 2022(17.7.6)
- vcpkg
- git(2.42.0)

## 前置き
Visual StudioおよびGit for Windowsがインストールされているものとします。

## 用語

### vcpkg

[公式ドキュメント](https://vcpkg.io/en/index.html)

Microsoftが提供しているC++ライブラリのパッケージ管理ツールです。netcdf-cxx4のインストール時に使用します。netcdf-cxx4の依存ライブラリは結構な数あるので、こういったツールがないとそれらを全てCMakeすることになります。（はじめはCMake使おうと思ってたんですけど、コマンドを4回叩いたところで心が折れました……。）

vcpkgには、ライブラリを全部グローバルにインストールするクラシックモードと、ディレクトリ毎にバージョンを指定してインストールするマニフェストモードの二種類の操作方法があります。今回はクラシックモードでやります。

### netCDF

[公式サイト](https://www.unidata.ucar.edu/software/netcdf/)

気象分野で広く使われるデータ形式の一種。アメリカのUnidataが開発し、FortranやCなど様々な言語で利用可能なAPIが提供されています。気象屋さんお馴染みですね。

## vcpkgの導入

ドキュメントの手順に従ってインストールします。

1: [github](https://github.com/microsoft/vcpkg)からクローンする

```powershell
git clone https://github.com/microsoft/vcpkg.git
```

PowerShellを開き、適当な場所にクローンします。今回はC:\Users\usernameにおきます。Windowsはパスが長すぎると動いてくれないので、あんまり下層には置かないように。

2: bootstrapを起動し、vcpkgをビルドする。

```powershell
.\vcpkg\bootstrap-vcpkg.bat
```

全部自動でビルドしてくれます。ビルド後に`vcpkg.exe`という名前の実行ファイルが生成されます。
(1と2の手順は、Githubからzipでダウンロードして、解凍したフォルダの中にある`bootstrap-vcpkg.bat`をダブルクリックする方法でも大丈夫です。)


vcpkgの中に移動して、コマンドが使えるか確認してみます。
```powershell
cd vcpkg
.\vcpkg
```
vcpkgのパスを環境変数に設定すれば、どこでコマンドを叩いても認識してくれます。今回はやりません。以後、vcpkg以下で作業をするものとします。

## netcdf-cxx4をインストールする
`vcpkg search [keyword]`で利用可能ライブラリを検索することができます。netcdf-cxx4がちゃんと対応しているか確認します。
```
PS C:\Users\username\vcpkg> .\vcpkg search netcdf
gdal[netcdf]                              Enable NetCDF support
minc                     2.4.03#3         MINC - Medical Image NetCDF or MINC isn't netCDF
minc[minc1]                               Support minc1 file format, requires NETCDF
netcdf-c                 4.8.1#4          A set of self-describing, machine-independent data formats that support th...
netcdf-c[dap]                             Build with DAP remote access client support
netcdf-c[hdf5]                            Build with HDF5 support
netcdf-c[nczarr]                          Build with NCZarr cloud storage access support
netcdf-c[nczarr-zip]                      Build with NCZarr ZIP support
netcdf-c[netcdf-4]                        Build with netCDF-4 support
netcdf-c[tools]                           Build utilities
netcdf-cxx4              4.3.1#5          a set of machine-independent data formats that support the creation, acces...
The result may be outdated. Run `git pull` to get the latest results.
If your port is not listed, please open an issue at and/or consider making a pull request.  -  https://github.com/Microsoft/vcpkg/issues
```

最下段にありました。名前も`netcdf-cxx4`でよさそうです。

ではインストールしましょう。以下のコマンドを実行します。`vcpkg install [名前]`でインストールされます。（tripletは環境指定）


```powershell
.\vcpkg install netcdf-cxx4 --triplet x64-windows
```

30分くらい待ちましょう。これでnetcdf-cxx4がインストールされました。簡単すぎてちょっと不安になりますね。インストールしたライブラリを確認してみます。`.\vcpkg list`と入力します。

```
PS C:\Users\username\vcpkg> .\vcpkg list
curl:x64-windows                                  8.4.0#1             A library for transferring data with URLs
curl[non-http]:x64-windows                                            Enables protocols beyond HTTP/HTTPS/HTTP2
curl[schannel]:x64-windows                                            SSL support (Secure Channel)
curl[ssl]:x64-windows                                                 Default SSL backend
curl[sspi]:x64-windows                                                SSPI support
hdf5:x64-windows                                  1.14.2              HDF5 is a data model, library, and file format f...
hdf5[szip]:x64-windows                                                Build with szip
hdf5[zlib]:x64-windows                                                Build with zlib
netcdf-c:x64-windows                              4.8.1#4             A set of self-describing, machine-independent da...
netcdf-c[dap]:x64-windows                                             Build with DAP remote access client support
netcdf-c[hdf5]:x64-windows                                            Build with HDF5 support
netcdf-c[nczarr]:x64-windows                                          Build with NCZarr cloud storage access support
netcdf-c[netcdf-4]:x64-windows                                        Build with netCDF-4 support
netcdf-cxx4:x64-windows                           4.3.1#5             a set of machine-independent data formats that s...
pkgconf:x64-windows                               2.1.0               pkgconf is a program which helps to configure co...
szip:x64-windows                                  2.1.1#12            Szip compression software, providing lossless co...
vcpkg-cmake-config:x64-windows                    2022-02-06#1
vcpkg-cmake:x64-windows                           2023-05-04
vcpkg-pkgconfig-get-modules:x64-windows           2023-09-06
vcpkg-tool-meson:x64-windows                      0.63#1              Meson build system
zlib:x64-windows                                  1.3                 A compression library
```

zlibやhdf5等の依存ライブラリも全部まとめてインストールされていることがわかります。vcpkg全体で大体13GBくらいでした。

## Visual Studioで使用する

```powershell
.\vcpkg integrate install
```

integrateコマンドを実行することで、Visual Studioでライブラリを利用することができます。一度実行すれば、今後はどこのプロジェクトでも`#include <netcdf>`と書くことができます。

早速、Visual Studioを開いてみましょう。
「新しいプロジェクトの作成」→「コンソールアプリ」→「作成」を選択します。
netcdf-cxx4の[github](https://github.com/Unidata/netcdf-cxx4)の下部に使用例が記載されているので、コピー&ペーストします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2162884/f4257ca8-c07c-f508-8f15-a84d02d41365.png)

ちゃんと読めてそうですね！今度はビルドしてみます。
「ビルド」→「ソリューションのビルド」、「デバッグ」→「デバッグの開始」を選択します。
上手くいっていれば、simple_xy.ncがcppファイルのディレクトリに出力されているはずです。

## おわりに
CMakeで2日悩んでいたところが一時間ちょっとで終わってしまった。感動。
今度はgribも扱ってみたいですね。

## 追記
なんかVisual Stuio 2022を更新したら使えなくなった……。git pullして更新すると直りました。zipで取ってきている人は最新版をダウンロードするといいかもしれないです。
```powershell
cd vcpkg
git pull
.\bootstrap-vcpkg.bat
```

## 参考
- [vcpkgでC/C++ライブラリを簡単に導入しよう](https://www.ktakedev.com/blog/90/)
- [vcpkgを使ってみた](https://qiita.com/jugemjugemu/items/fcb72bdca13dc06b0f37)
- [netCDF4 C++ APIのビルド備忘録](https://qiita.com/gracom/items/5bc761ddfc1136ca5009)