C言語の関数を取り込む(import)その1.5

gnuplot 5.0以降では、C言語で書かれた関数をgnuplotで取り込んで使うための非常に強力なコマンド「import」が使えるようになりました。ここでは、そのimportコマンドの使い方について詳細に解説します。

コンパイラのインストール(MinGW-W64/MSYS2の場合)

その1で紹介したMinGW/MSYSは、やや古くなっていたり、64bitのコンパイルができなかったりするなどの問題があります。そこで、類似のプログラムですがより進化しているMinGW-W64/MSYS2を使うやり方を紹介します。このやり方は、Windows版のgnuplotをビルドしていらっしゃる名古屋大学の松岡先生に教えていただきました。また、参考になるページとして、以下を挙げておきます。

具体的なやり方は以下の通りです。

  1. MSYS2のSource Forgeページに行きます。64bit版をインストールする場合は、Base → x86_64 とフォルダをたどって、msys2-x86_64-XXXXXXXX.exeをダウンロードします(XXXXXXXXXは日付)。使用しているコンピューターが32bit版だったりするという理由で32bit版が必要な場合は、フォルダをBase → i686とたどって、msys2-i686-XXXXXXXX.exeをダウンロードします。以下の説明は、64bit版での説明です。
  2. ダウンロードしたファイルを実行すると、以下のような画面が出てきます。
  3. 「次へ」をクリックするとすると、以下のような画面が出てきます。ここでは、インストール先のフォルダを指定しますが、特に問題なければデフォルトのままがいいと思われます。
  4. 「次へ」をクリックすると、以下のような画面が出てきます。スタートメニューのショートカット名を聞かれるので、必要があれば変更してください。
  5. 「次へ」をクリックすると、以下のような画面が出てインストールが始まります。
  6. インストールが終了すると、以下のような画面になりますので、「完了」をクリックします。「MSYS2 64bitを起動中」をチェックしておきます。
  7. すると、MSYS2のシェルが立ち上がります。なお、ターミナルのフォントなどは、ターミナルのタイトルバーを右クリックし、「Options」→「Text」から変更できます。(私はMS ゴシックの12ポイントに変更しました。)
  8. ここでスタートメニューを見ると、以下のように「MinGW-w64 Win32 Shell」「MinGW-w64 Win64 Shell」「MSYS2 Shell」という3つのプログラムが新しくインストールされていることがわかります。
  9. まず、MSYS2のシェルのターミナルで
    update-core
    と入力します。その際の動作によって、以下のa,bのどちらかを行ってください。
    1. 「bash: update-core: コマンドが見つかりません」というエラーが出る場合(2016年4月以降にインストールを試みた場合はこうなる可能性が高いです)は、ターミナルから
      pacman -Syuu
      と入力します(uが二つあることに注意))。pacmanというのはMSYS2でのパッケージ管理プログラムです(詳しいマニュアル)。このコマンドを実行することで、必要なパッケージをアップデートしてくれます。もし、アップデートが必要なパッケージが見つかれば、以下のようにインストールするかどうか聞かれるので、Yを入力して「Enter」キーを押すと、アップデートが始まります。
      コアプログラムが更新される場合は、「アップデート終了後にはexitコマンドを使わず、ウィンドウ右上の×ボタンを押すか、Alt+Fでウィンドウを閉じるように」という注意が(英語で)出てくることがあるので、その場合は指示に従って、ウィンドウを閉じてMSYS2シェルを再起動します。
      この場合、警告ウィンドウが出ますが、OKをクリックします。
      このpacman -Syuuを何度か繰り返し、以下のようにすべて最新の状態になればアップデート完了です。なお、この操作はある程度頻繁にやった方がいいでしょう。
      また、最新版になると、MSYS2のシェルを立ち上げた時に、Windowsのコマンドプロンプトも同時に出てくるようになってしまいます。シェルへのショートカットからのリンク先を、新しく導入された.exeファイルに変更(例えばmsys2_shell.bat → msys2.exe)に変更しておくと、コマンドプロンプトが出てくる問題は解消します。(例えば、スタート画面から右クリックで「ファイルの場所を開く」→ 開かれたフォルダでショートカットを右クリックして「プロパティ」の「リンク先」を編集します))
    2. update-coreをした時に以下のような画面が出た場合は、このコマンドを使ってMSYS2のシステムのコアプログラムを最新版にします。図にあるように、「アップデート終了後にはexitコマンドを使わず、ウィンドウ右上の×ボタンを押すか、Alt+Fでウィンドウを閉じるように」という注意がでています。「Enter」キーを押すと、アップデートが進みます。
      以下のような画面まで来たら、指示通り、ウィンドウ右上の×ボタンを押すか、Alt+Fでウィンドウを閉じます
      一応警告が出ますが、「OK」で終了します。
      スタートメニューから、MSYS Shellを再び起動します。
      pacman -Suu
      と入力します。すると、以下のような画面が出るので、Yと「Enter」を入力します。
      すると、アップデートが実行されます。以下のように警告等が出ずにプログラムが終了していればOKです。
      なお、core-updateによってコアプログラムが最新版になれば「bash: update-core: コマンドが見つかりません」というメッセージが出るようになります。これ以降は、上記のa.の方法でアップデートをします。
  10. 必要なコンパイラなどをインストールします。64bit版のコンパイラをインストールする場合、MSYS2のシェルから
    pacman -S --needed base-devel mingw-w64-x86_64-toolchain msys/dos2unix
    と入力します。すると、以下のような画面が出ます。どのパッケージをインストールするか選択するのですが、とりあえずデフォルトのallでいいので、ただ「Enter」キーを押すと、アップデートが進みます。 なお、32bit版のコンパイラが必要な場合は、
    pacman -S --needed base-devel mingw-w64-i686-toolchain msys/dos2unix
    とします。64bitのMSYS2をインストールした場合は、64bit版のコンパイラと32bit版のコンパイラを両方入れることもできます。
  11. 今度はMinGW-W64について、どのパッケージをインストールするか選択するのですが、ここもデフォルトのallでいいので、ただ「Enter」キーを押すと、アップデートが進みます。
  12. 下のようなメッセージが出たら、Yを入力して「Enter」を押します。すると、インストールが始まります。
  13. インストールが無事終了すると、以下のようにpacmanが終了します。
  14. exitと入力して、コンソールを閉じます。

なお、MSYS2から提供されるコンパイラで問題がある場合は、以下のようにMinGW-W64ネイティブのコンパイラを入れることも可能です。(通常の使用ではおそらく不要)

  1. MinGW W64のSource Forgeページから「Files」→「Toolchains targetting Win64」→「Personal Builds」→「mingw-builds」→「5.3.0」→「threads-win32」→「seh」とたどって到着したページから「x86_64-5.3.0-release-win32-seh-rt_v4-rev0.7z」をダウンロードします。
  2. ダウンロードしたファイルを.7zファイルを解凍できるプログラム(7zipなど)で解凍します。以下の図は、7zipを用いて解凍する場合の説明です。右クリックから「7zip」→「ここに解凍」を選びます。
  3. すると、以下のようなmingw64というフォルダができます。
  4. C:\msys64\mingw64\というフォルダを作り、上述の解凍してできたフォルダの中身を移します。
  5. スタートメニューからMinGW-w64 W64 Shellを立ち上げます。(またはC:\msys64にあるmingw64_shell.batをダブルクリックします。)ターミナルにgcc --versionと入力したときに、以下のようなメッセージが出れば、インストールができています。

サンプルのコンパイルテスト

MinGW-w64/MSYS2がインストールできたら、まずはgnuplot付属のサンプルプログラムをコンパイルしてみましょう。

  1. まず、gnuplotのsource forgeページからgnuplotのソースファイル(gnuplot-X.X.X.tar.gz)をダウンロードします。
  2. ダウンロードしたファイルを展開します。展開できない場合、適当な解凍ツール(例えばLhaplusなど)をインストールしてから展開させます。
  3. 解凍したフォルダから、「demo」→「plugin」のフォルダの中にサンプルプログラム「demo_plugin.c」や、そのほか必要なファイルが入っています。
  4. 適当な作業用のフォルダ(ここでは「C:\gnuplot\plugin」とします)を作り、そこに「demo_plugin.c」「gnuplot_plugin.h」「plugin.dem」の3つのファイルをコピーします。
  5. gnuplotのソースファイルの中の、「src」フォルダの中にある、「gp_types.h」を作業用フォルダにコピーします。
  6. 「gp_types.h」をテキストエディタ・メモ帳等で開き、40行目にある #include "syscfg.h"という行をコメントアウトします。さらに、代わりにtypedef double coordval;という行を加えます。具体的には、以下のように/**/#include...の行を囲み、その下にtypedef...を加えます:
    /* #include "syscfg.h" */
    typedef double coordval;
    typedefの行の末尾のセミコロンに注意してください。修正ができたら、ファイルを上書き保存します。
  7. gnuplotのソースファイルの中の、「config」フォルダの中にある、「config.mgw」を作業用フォルダにコピーし、ファイルの名前を「config.h」に変更します。
  8. スタートメニューから「MinGW-w64 Win64 Shell」(32bit版のコンパイルをしたい場合は「MinGW-w64 Win32 Shell」。いずれの場合もMSYS2 Shellではないことに注意!)を開きます。下図のようにcd コマンドを用いて作業用フォルダに移動します。
  9. コマンドラインから
    gcc -shared -o demo_plugin.dll demo_plugin.c -DHAVE_CONFIG_H -I.
    と入力して、Enterキーを押すと、コンパイルできます(末尾のドット.に注意)。下図のように何もエラーメッセージが出なければ、コンパイル成功です。
  10. うまくコンパイルできていれば、作業フォルダに「demo_plugin.dll」というファイルができているはずです。
  11. 64bit版のgnuplot(32bit版のコンパイラを使った場合は32bit版のgnuplot)で「plugin.dem」を開きます。wgnuplotから「File」→「Demos...」をクリックして、「plugin.dem」を指定すれば開けます。他に、xyzzyのwgnuplot-modeを用いてもいいですし、gnuplotのコンソールからcdしてからloadしてもいいでしょう。gnuplotと、C言語のコンパイラのbit数が整合しない場合は、
    "C:\gnuplot\plugin\plugin.dem", line 13: warning: dynamic library error
    "C:\gnuplot\plugin\plugin.dem", line 13: failed to load external function
    のようなエラーが出ます。
  12. すると、下図のように、デモがスタートします。
  13. OKをクリックしていくと、デモが進んでいきます。これらがうまく見られれば、c言語でコンパイルした「demo_plugin.dll」ファイルをgnuplotで読み込むのに成功したことを意味しています。

長くなってきたので、その2へ続きます。