iRICソフトウェア上で動作するプログラムを自由に操るまでの記録（２）「Visual Studioを用いたプロジェクト作成、ビルドの流れ」

# 目次
1. [はじめに](#はじめに)

2. [Visual Studioでのプログラムの編集](#visual-studioでのプログラムの編集)

# はじめに
## この記事の目的・内容
これは、初めてプログラミングに触れる人が河川シミュレーションソフトウェア「iRIC_v4」のNays2DH（ソースコードは[こちら](https://github.com/iRICsolvers/v4_Nays2DH)）を自らの手で改良し、実行可能にすることができるように基礎知識と手順を記すシリーズ記事<qiitaの記事へのリンクをここに入れる>の一部である。

前回記事で、プログラムを動かす仕組みについて学んだ。今回はIDEのVisual Studioを遣いながら、実際にプログラムを動かしてみる。
この記事ではVisual Studioの特徴に触れながら、自分の手で改良したNays2DHのソースコードをビルドすることができるように適切に環境設定をする方法を解説する。

## 前提
シリーズで一貫して、以下のような環境を想定する。
- 言語：Fortran
- IDE：Visual Studio 2022
- コンパイラ：Intel Fortran Compiler Classic (ifort), Intel(R) Fortran Compiler (ifx)
- OS: Windows 

Fortranの開発環境は、[こちらの記事](https://qiita.com/Kazutake/items/a069f86d21ca43b6c153)の方法で構築している。


# Visual Studioとは
## Visual Studioの機能
Visual Studioは、マイクロソフト社が開発した、ソースコードを編集する**コードエディタ**、ソースコードを機械が解読可能なオブジェクトファイルに翻訳する**コンパイラ**、オブジェクトファイルを他のライブラリと結合してアプリケーションを生成する**リンカ**、アプリケーションで発生した不具合の原因を探す**デバッガ―** を一つにまとめた、**IDE(統合型開発環境)** の一種である。

様々なIDEがある中でもVisual Studioは、多言語に対応し、拡張機能が豊富で、デバック機能が充実し、Gitなどと統合することでチーム開発もスムーズに行うことができる点に強みを持つ。Windowsにのみ対応し、他のOSでは使うことができない点には注意が必要である。

# Visual Studioでのプログラムの開発
## 大まかな流れ
Visual Studioを用いたプログラムの開発は、一般に下の図のような手順で行われる。

![development.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917090/e7964485-bef6-d016-5eaf-c7ad3a60c441.png)

1. **プロジェクト、ソリューションの作成**：Visual Studioでソースコードを編集しビルドするためには、ソリューション・プロジェクトを作り、そこに編集したいソースコードを格納する必要がある。
2. **コーディング**：Visual Studioのエディタを使って、プログラムのロジックを記述する。
3. **ビルド**：ソースコードをコンパイルして実行可能なファイルを生成する。プロジェクトのプロパティを設定し、ビルドを実行する。
4. **テスト**：生成された実行ファイルをテストし、期待通りに動作するか確認する。
5. **デバック**：プログラムの不具合を修正する。Visual Studioのデバッガを使って、ステップ実行や変数の監視を行う。
6. **デプロイ**：最終的な実行ファイルを動作させる環境に配置して利用できるようにし、配布する。

本記事では、「1.プロジェクト・ソリューションの立ち上げ」と「3.ビルド」について扱う。「2.コーディング」、「4.テスト」、「5.デバック」については、別の記事で触れる。「6.デプロイ」に関しては、今回のシリーズ記事は、iRIC Softwareという既存のアプリに対してその一部を改良することを目的としていることから扱わないものとする。

# プロジェクト、ソリューションの作成
## プロジェクト、ソリューションとは何か
　Visual Studioでは、ソースコードをアプリケーションの構成単位である**プロジェクト**に格納し、**ソリューション**と呼ばれるコンテナのようなものでプロジェクトを整理する。

## プロジェクト、ソリューションの作り方

1. **ソースコードをリモートからローカルにクローンする**

    下準備として、リモートにある[Nays2DHのソースコード](https://github.com/iRICsolvers/v4_Nays2DH)をローカルにクローンする。例えば[こちらの記事](https://git-and-github-for-non-it-engineers.readthedocs.io/ja/latest/04/01/04.html)のような方法で行うことができる。
    
2. **空のプロジェクトを作る**

    Visual Studioを開き、「新しいプロジェクトの作成」を選択する。その先で表示されるプロジェクトテンプレートの一覧からfortranの「Empty Project」を選ぶ。Visual StudioではデスクトップアプリやWebアプリなど、様々なアプリを開発できるが、今回開発をするのはコンソールアプリであるので、「Console」と表記のあるものを選ぶ。

    ![empty_project-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917090/4c8b1eee-884c-ec6c-a3c9-315c7ee1b537.png)

    プロジェクト名と保存場所を指定して「作成」をクリックする。
    最初のプロジェクトを作ると、そのプロジェクト（`プロジェクト名.vfproj`）とそれを含むソリューション（`ソリューション名.sln`）が指定したディレクトリに自動的に生成される。また、ビルドの結果を格納するソリューションフォルダも生成される。

3. **既存のコードを格納する**

    メニューから「表示」→「ソリューションエクスプローラー」を開く。プロジェクトを選択して右クリックし、「追加」→「既存の項目」を選択する。追加したいファイルを選択して「追加」をクリックする。Nays2DHの場合、`iric.f90`、`Nays2DH.f90`ファイルを追加すればよい。
    
    ![add_codes-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917090/77fcb607-5b7f-b178-639c-a3b0b35ee8b9.png)


これで、任意のコードが編集できるようになる。

# Visual Studioでのビルド
## ビルドの関わるプロジェクトのプロパティを設定

自分で編集したソースコードが実行ファイルになるまでのプロセスで参照すべき箇所をプロジェクトのプロパティで設定していく。プログラムが実行ファイルになるまでにどのような処理が行われているかについては、[前回の記事](https://qiita.com/Uemac001/private/37ee10f84aae44f9fd81)に記した。

![flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917090/3da06f22-d84c-2338-11d5-d29adb771d9c.png)

### プロジェクトのプロパティの設定

ビルドに関するオプションは、プロジェクトのプロパティより設定できる。
ソリューションエクスプローラーでプロジェクトを右クリックし、「プロパティ」を選択する。

- **構成・プラットフォームのオプションを設定**

    「構成」ではビルド時にDebugとReleaseどちらに最適化された構成にするかを選ぶ。

    「プラットフォーム」はビルド、実行をするとなる環境に合わせて選ぶべきオプションである。現在（2024年）に一般的に流通している64bit CPUを用いて動作させる場合はx64を選ぶ。32bit CPUで動作させる場合はx86を選択する。

    構成、プラットフォームは「すべての構成」、「すべてのプラットフォーム」にしておく。

    :::note info

    **デバッグモードとリリースモードの違い**

    ビルドには「Debug」と「Release」の2つのモードがある。違いは以下の通り。目的によって使い分ける。
    

    | モード         | 目的                               | デバッグ情報                         | 最適化           | サイズ                     | エラーチェック                       |
    |----------------|------------------------------------|--------------------------------------|------------------|----------------------------|--------------------------------------|
    | デバッグモード | コードの間違いやバグを発見しやすくする | 含まれており、ステップ実行や変数の監視が可能 | 行われない       | 実行ファイルのサイズが大きくなる | 詳細なエラーチェック |
    | リリースモード | 最終的な製品として配布する          | 含まれていないため、ステップ実行や変数の監視は不可 | 行われる         | 実行ファイルのサイズが小さくなる | デバッグモードほど詳細なエラーチェックは行われない |


    :::

<!--
2. **デバッグをする際の実行ファイルのワーキングディレクトリの設定**

    左側のメニューから「構成プロパティ」→「Debugging」→「アクション」→「Working Directory」を選択し、実行ファイルのワーキングディレクトリを指定する。


3. **デバッグをする際の環境変数の設定**

    「Debugging」→「アクション」→「Environment」を選択し、ここに「PATH="`パス`"」という形でパスを指定することで、デバッグにおけるプログラムの環境変数を指定することができる。これは、システム環境全体に適用されるものではなく、そのプロジェクトのデバッガのみに適用される。
   
    iRIC_v4のソルバーをIntelのコンパイラーでコンパイルする場合には、iRIC_v4のプログラムファイルのパス（`C:\Users\Username\iRIC_v4\guis\prepost`）と、Intelのコンパイラーへのパス（Windowsの場合は`C:\Program Files (x86)\Intel\oneAPI\compiler\latest\bin`）を通せばよい。
-->
-  **リンカの設定**

    左側のメニューから「Fortran」→「Linker」→「Input」から、使用する静的ライブラリのパスを指定する。これでプログラム内で用いられる標準関数が、リンクのときに正しくプログラムに結び付けられる。

これでプロジェクトのプロパティ設定が完了し、ビルドの準備が整う。

:::note info

絶対パス（フルパス）とは、指定したディレクトリまでのパスをルートディレクトリから記述することで、ファイルやディレクトリの位置を一意に特定するパスである。
    例：`C:\Users\Username\program\program.exe`
相対パスとは現在の作業ディレクトリ（カレントディレクトリ）からの相対的な位置を示すパスである。
    例：`..\program\program.exe`
絶対パスで記述してしまうと、人によって親ディレクトリの名称が違うために動かなくなってしまうことが多いが、相対パスで記述しておくと、他人にプログラムを渡したときにそのまま動かすことができて便利である。

:::

## ビルド
　メニューバーの「ビルド」よりビルドを行うことができる。ソリューション単位またはプロジェクト単位でビルドを行う。ビルドが完了すると、出力ウィンドウに結果が表示される。ビルドに成功した場合、実行ファイルが指定した出力フォルダに生成される。
 
![buildlog-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3917090/afabf0f5-370b-d6e2-5097-5131ffb258c0.png)

# 参考文献
- ナルボ. 第2版VisualStudioパーフェクトガイド. 2024. 技術評論社.