GSL - GNU Scientific Library を Windows Microsoft Visual Studio で使う方法

今回は GSL と呼ばれるライブラリを WindowsVC++ 環境で使えるようにする方法について説明していこうと思います.
環境としては Windows Vista, XP, Visual C++ 2008, 2005 を想定しています.これ以外の環境では以下で説明する手順ではうまくいかない場合があるかもしれませんが,ご了承ください.

また本記事の多くは GNU Scientific Library for Windows を参考にしています.素晴らしい記事を書いてくださった事に,この場を借りてお礼を申し上げたいと思います.

Cygwin のインストール

GSL を Visual C++ で使えるようにするためには,まず Cygwin と呼ばれる Windows 上で Linux 環境をエミュレートするソフトウェアをインストールする必要があります(すでに Linux 環境を使える状況にある場合は,Cygwin をインストールする必要はありません).
まずは Cygwin Information and Installation の Install or update now! と書かれたリンクより,setup.exe をダウンロードしましょう.
setup.exe を実行後は,次のようにします.

  1. Install from Internet を選択し,次へをクリック.
  2. Root Directory と Install for は好きなようにして構いません.
  3. Local Package Directory も好きな場所を選びます(選択した場所にダウンロードしたパッケージが一時的に保存されるだけです).
  4. Select Packages では次のものを選択します(重要!).

Cygwin のインストールは以上で終了です.

GSL のセットアップ

次に GSL のセットアップを始めます.
まず GSL - GNU Scientific Library に行き,gsl をダウンロードします.ここでは gsl-1.12.tar.gz をダウンロードしたとします(本記事執筆時の最新バージョン gsl-1.13 は私の環境では Cygwin で make するとエラーが出たので,1.12 を用いました).
gsl-1.12.tar.gz を解凍後は以下のようにします.

  1. GNU Scientific Library for Windows より vcgsl をダウンロードし,解凍してできる msvc, scripts フォルダを gsl-1.12.tar.gz を解凍してできた gsl-1.12 フォルダにコピーします.
  2. scripts\windist.sh の文字コードEUC-JP(改行コードは LF) に変更する.
  3. Cygwin (あるいは他の Linux 環境)を起動し,gsl-1.12 フォルダに移動します.
    • Cygwin を使う場合,例えば gsl-1.12.tar.gz を C:\Users\yano\home\gsl-1.12 に解凍したのなら,Cygwin を起動後
      $ cd /cygdrive/c/Users/yano/home/gsl-1.12
      とすることで gsl-1.12 フォルダに移動できます.
  4. 次のコマンドを順に入力します.
    $ ./autogen.sh
    $ ./configure --enable-maintainer-mode
    $ make dist
    ここまでで gsl1.12/gsl-1.12.tar.gz というファイルができたことを確認してください.
    $ make
    $ make install
    ここまでで usr/local/lib/libgsl.a, usr/local/lib/libgslcblas.a, usr/local/include/gsl/gsl_*.h というファイルができたことを確認してください.
  5. gsl-1.12/msvc/usr/lib というフォルダを作り,その中に make install でできた libgsl.a と libgslcblas.a をコピーし,cd コマンドで gsl-1.12/msvc フォルダに移動し,
    make update
    とします.
  6. cd コマンドで gsl-1.12 フォルダに移動し,次のコマンドを入力します.
    $ ./scripts/windist.sh gsl-1.12.tar.gz
    ここまでで gsl1.12/gsl-1.12.zip というファイルができたことを確認してください.

Windows 用 GSL のビルド

作成された gsl1.12/gsl-1.12.zip を解凍し,次のようにします.

  1. gsl-1.12\GSLDLL\gsl.def の
    • _gsl_ を gsl_ に置換.
    • _GSL_ を GSL_ に置換.
  2. gsl-1.12\GSLDLL\gslcblas.def の
    • _cblas_ を cbas_ に置換.
  3. gsl-1.12\GSLDLL.dsw を(ダブルクリックするなりして)Visual C++ で開く.
    • 変換してこのプロジェクトを開きますか?には「すべてはい」と答える.
  4. gsl プロジェクトのプロパティ(ソリューション エクスプローラに表示されている gsl という文字を右クリックし,メニューからプロパティを選びます)を表示し,構成プロパティ → C/C++ → コード生成 → ランタイム ライブラリを Debug 構成(gsl プロパティ ページウィンドウの左上に表示されています)ではマルチスレッド デバッグ (/MTd),Release 構成では(gsl プロパティ ページウィンドウの左上のリストを Release にします)マルチスレッド (/MT) に変更する.
  5. 同様に,gslcblas プロジェクトのプロパティを表示し,C/C++ → コード生成 → ランタイム ライブラリを Debug 構成ではマルチスレッド デバッグ (/MTd),Release 構成ではマルチスレッド (/MT) に変更する.
  6. メニュー → ビルド → バッチ ビルドよりバッチ ビルドウィンドウを開き,gsl(Release) と gslcblas(Release) のビルドのチェックボックスをチェックし,リビルドをクリックします(コンパイルとリンクが始まります).
    • Mac ファイル形式が検出されました: ソース ファイルを DOS または UNIX 形式に変換してくださいってエラーが出た.
      • エラーをダブルクリックすると,行の終わりを標準化しますか?と聞かれるので,「はい」と答えてから再リビルドしてください.
    • _gsl_combination_get は既に combination.obj で定義されていますってエラーが出た.
      • gsl_combination.h の gsl_combination_get 関数の定義を消し,宣言だけにします.そして,消した定義を代わりに gsl_combination.c に書きます.その後再リビルドしてください.
    • _gsl_complex_rect は既に inline.obj で定義されていますってエラーが出た.
      • gsl_complex_math.h の gsl_complex_rect 関数の定義を消し,宣言だけにします.そして,消した定義を代わりに inline.c に書きます.その後再リビルドしてください.
  7. gsl ライブラリ用のフォルダを用意する.
    • ここでは,C:\Program Files\gsl というフォルダを用意したとします.
  8. C:\Program Files\gsl フォルダに include という名前のフォルダを作り,make install でインストールした場所(デフォルトでは /usr/local/include)にある gsl フォルダをコピーする.
  9. C:\Program Files\gsl フォルダに lib という名前のフォルダを作り,その中に次のファイルをコピーする.
    • gsl-1.12\GSLDLL\Release\gsl.dll
    • gsl-1.12\GSLDLL\Release\gsl.lib
    • gsl-1.12\GSLDLL\Release\gslcblas.dll
    • gsl-1.12\GSLDLL\Release\gslcblas.lib
  10. C:\Program Files\gsl\include フォルダにコンパイラのインクルード ファイルパスを通します.
  11. C:\Program Files\gsl\lib フォルダにコンパイラのライブラリ ファイルパスを通します.

以上で GSL を VC++ で利用する準備はすべて終了しました.
お疲れさまでした.

gsl を使ったソースコードコンパイルするときは?

次のようにします.

  • プロジェクト→プロパティ→構成プロパティ→リンカ→入力→追加の依存ファイルに以下を加える.
    • gsl.lib gslcblas.lib

あるいは,

    • 次のコードをソースに加える(main 関数があるファイルの #include 命令の直後にでも).
#pragma comment(lib, "gsl.lib")
#pragma comment(lib, "gslcblas.lib")
  • さらに,gsl を用いてコンパイルした実行ファイルと同じディレクトリに,gsl.dll と gslcblas.dll を置く(この作業が面倒,あるいはよくわからなければ,C:\Windows\System32 フォルダに gsl.dll と gslcblas.dll を置いてください.).

ところで,コンパイラのパスを通すって?

  • Visual C++(2005 or 2008)
    • ツール→オプション→プロジェクトおよびソルーション→VC++ ディレクトリより,「ディレクトリを表示するプロジェクト」で「インクルード ファイル」あるいは「ライブラリ ファイル」を選択し,パスを追加.

以上です.