FFTWをWindowsでインストールしようとして詰んだ時の解決策の１つ

# 背景
　FFTWは高速なFFTを実装できるオープンソースの１つです
　[FFTW公式サイト](https://www.fftw.org)

　私もCのコードを高速化するためにFFTWを導入しようとしましたが、Windowsでのインストールに苦戦しました

　[公式ドキュメント](https://www.fftw.org/install/windows.html)やブログには、以下のようなインストール方法が紹介されていますが、背景知識が乏しいため、うまくいきませんでした
<br>

 * Visual Studioでコンパイル済みdllファイルを導入する
    + →Visual Studioのプロジェクトを作成する必要がありそうで面倒。そもそもコマンドプロンプト上でコンパイルしたい
 * MinGWでFFTWをコンパイルする
     + →MinGWでライブラリをコンパイルする方法がそもそもよくわからない

<br>
　そこで、私が試行錯誤の末にたどり着いた方法を記録します

# 読者の対象
* **C**でFFTWを導入したい方(C++も可)

* **Windows**にFFTWをインストールしたい方

* **コマンドプロンプト**（Visual Studioを経由しない）でコンパイルしたい方

* **MinGWを補うソフトウェア**を導入してもよい方

# 著者のインストール環境（2024/09時点）
* Windows 11

* FFTW 3.3.10-5

# インストール方法の要約
　1. **MSYS2をインストール**

　2. MSYS2 MINGW64のプロンプトでFFTWを含むコンパイルに**必要なライブラリをインストール**

　3. コマンドプロンプトで**CおよびC++のコードをコンパイル**

# 詳細
## 1.MSYS2をインストール
### MSYS（Minimal SYStem）とは
　Windows上でUnixライクな環境を提供するソフトウェアの１つ
 
　特にMinGW（Minimalist GNU for Windows）との組み合わせでよく使わる

　MSYS2はその後継版

---

### MSYS2を導入する利点
　MinGWはWidowsでCやC++をコンパイルする際にインストールした方も多いでしょう

　MSYS2はそのMinGWの機能を補完するような便利な機能があります

　例えば、パッケージ化されたライブラリを```pacman```のコマンドでインストールできます

　その**パッケージインストールの手軽さ**がMSYS2を導入する利点です

---

### MSYS2のインストール方法
#### インストーラのダウンロード
１． 公式サイトからインストーラ```.exe```をダウンロードする
[MSYS2 ダウンロードサイト](https://www.msys2.org)
![2024-09-25 04.29.12 www.msys2.org 3f13255005b31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582212/4aae421f-e8a1-1c64-afd2-d707710e55a0.png)

---

### インストーラの実行
２． ダウンロードした```.exe```を実行する

:::note info
基本デフォルト設定でOK（カスタム可能）
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582212/6852c410-8ffe-f653-6653-3c4077bd3a4b.png)

---

#### MSYS2プロンプトの起動
３． アプリ「**MSYS2 UCRT64**」を開く（タスクバーの虫眼鏡アイコンから検索して開く）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582212/82107645-5ba7-a58f-1165-770e2c1bb8b4.png)

---

#### MSYS2の初期設定
４． 出てきたプロンプトに以下のコマンドを実行して初期設定する

:::note info
```[Y/n]```で止まったら```Y```を入力してエンター
:::
``` 
pacman -Syu
```
``` 
pacman -Su
``` 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582212/12c556c7-1dab-040b-79be-0e8290cc12a0.png)
> 引用：https://www.kkaneko.jp/tools/win/windows_msys2dev.html 

---

### MSYS2の環境変数を登録
５． 管理者用コマンドプロンプトを開いて以下のコマンドを１つずつ実行する
```
powershell -command "$oldpath = [System.Environment]::GetEnvironmentVariable(\"Path\", \"Machine\"); $oldpath += \";C:\msys64\mingw64\bin\"; [System.Environment]::SetEnvironmentVariable(\"Path\", $oldpath, \"Machine\")"

powershell -command "$oldpath = [System.Environment]::GetEnvironmentVariable(\"Path\", \"Machine\"); $oldpath += \";C:\msys64\usr\local\bin\"; [System.Environment]::SetEnvironmentVariable(\"Path\", $oldpath, \"Machine\")"

powershell -command "$oldpath = [System.Environment]::GetEnvironmentVariable(\"Path\", \"Machine\"); $oldpath += \";C:\msys64\usr\bin\"; [System.Environment]::SetEnvironmentVariable(\"Path\", $oldpath, \"Machine\")"

powershell -command "$oldpath = [System.Environment]::GetEnvironmentVariable(\"Path\", \"Machine\"); $oldpath += \";C:\msys64\bin\"; [System.Environment]::SetEnvironmentVariable(\"Path\", $oldpath, \"Machine\")"

powershell -command "$oldpath = [System.Environment]::GetEnvironmentVariable(\"Path\", \"Machine\"); $oldpath += \";C:\msys64\opt\bin\"; [System.Environment]::SetEnvironmentVariable(\"Path\", $oldpath, \"Machine\")"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582212/3020a29f-436f-eb87-287b-3c60cd824a48.png)
> 引用：https://www.kkaneko.jp/tools/win/windows_msys2dev.html

---

#### 環境変数の確認
６．タスクバーの虫眼鏡から「環境変数を編集」を開き、```ユーザ環境変数(U)```の変数```PATH```をクリックして「編集(E)...」ボタンを押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582212/5b6fd640-b0cd-7d45-23f4-34c26df871c3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582212/f4c26fd7-3022-0c6b-d75b-3296f8138503.png)

---

#### MinGWの優先順位を下げる
７. もし、以下のような今までのMinGWのPathがあるのであれば一番下へ移動させる
```
C:\MinGW\bin
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582212/085a5079-606f-f470-bb7c-2339cb80c31b.png)
※これでMSYS2がMinGWより優先的に参照されてうまく動作する

## 2.MSYS2 MINGW64で必要なライブラリをインストール

#### MSYS2 MINGW64プロンプトを起動
１． アプリ「**MSYS2 MINGW64**」を開く（タスクバーの虫眼鏡アイコンから検索して開く）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582212/d0ae71ed-e8e3-0586-4e47-cf3adedce5bc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582212/c1d400db-d1d1-ab21-23cf-2691a07d744c.png)
> 引用：https://www.kkaneko.jp/tools/win/windows_msys2dev.html

---

#### コンパイルに必要なパッケージをインストール
２．以下のコマンドを、```MSYS2 MINGW64```のプロンプトで実行する
```
pacman -S base-devel msys2-devel mingw-w64-i686-toolchain mingw-w64-x86_64-toolchain mingw-w64-x86_64-boost
```

---

#### FFTWのインストール
３. ブラウザで```fftw msys```と検索し、Packageサイトの```pacman```から始まるコマンドをコピーし、```MSYS2 MINGW64```のプロンプトで実行する
```bash:例
pacman -S mingw-w64-x86_64-fftw
```
![2024-09-25 05.19.34 www.google.com 882083d3e2dd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582212/c2ac5b40-338d-7ffe-2b1f-2c6dc7578111.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3582212/3e4e875f-3c74-dda4-7ed7-e5915a9e835f.png)

---

４. ほかに必要なライブラリがあれば別途```pacman```でインストール

## 3.コマンドプロンプトでコードをコンパイル
以上の手順をもって、コマンドプロンプトでのコンパイルが可能になります

```bash:例
gcc -o a fftw_code.c -lfftw3 -lm
```

:::note info
FFTWを使ってコンパイルする際は、```-lfftw3 -lm```（double精度）、```-lfftw3f -lm```（float精度）、```-lfftw3l -lm```（long double精度）を使ってください
:::

## 参考文献
https://www.kkaneko.jp/tools/win/windows_msys2dev.html