2009年04月30日

テクスチャプラグインをWindowsでコンパイルする(2)

BlenderのテクスチャプラグインをWindowsでコンパイルする場合、テクスチャプラグインの公式ページともいうべきBlender Plugin Repositoyに書かれている方法では、現在のところうまくいきません。

あちこち探してみた結果、MicrosoftのVisual C++ 2008 Express Editionを使用する方法が見つかり、こちらの記事(3月15日)にその手順を書いています。

また、プラグインリポジトリにあるテクスチャプラグインの一部はこの方法ではうまくコンパイルできないものがあるため、LCCというコンパイラを使ってコンパイルする方法をこちらの記事(3月28日)に書きました。この記事を書いた時点では、Blenderからエクスポートしている関数をプラグインで使用している場合は、コンパイルに失敗していました。

その後、LCCコンパイラのマニュアルを調べてみたところ、エクスポートされている関数を利用するための方法がわかりました。今回の記事の手順で、LCCコンパイラでもプラグインリポジトリのすべてのテクスチャプラグインをコンパイルできるようになります。
具体的には、Microsoftのコンパイラを使用した場合のように、インポートライブラリ(plugin.lib)を作成しておいて、リンク時にそのファイルをコマンドの引数に追加する、という感じになります。

WindowsでGCCコンパイラを使用するための環境MinGWでもコンパイルできるようになりましたので、合わせてその手順をご紹介したいと思います。
(以下の内容は、自分で試した範囲でなんとか動作可能なプラグインをコンパイルできた、という状況で書いています。このため、不必要な手順が混じっていたり、本来必要な手順が抜けていたりするかもしれません。あくまで、参考程度のものとして見ていただければと思います。)

○LCCでのテクスチャプラグインのコンパイル
以前の記事と同じように、以下のような状況を想定してコンパイルを行います。
  1. Blenderの「plugins」フォルダを「C:\blender」というフォルダにコピーします。
  2. コンパイルの対象は、「texture」フォルダにあらかじめ入っているclouds2.cとします。
  3. tex.defファイルを「include」フォルダに置きます。
  4. 「include」フォルダ内にあるplugin.h、util.hの内容を一部修正します。
tex.defファイルの内容、plugin.h、util.hの修正内容については、3月28日の記事で書いた通りです。

・インポートライブラリ(.lib)の作成
Microsoftのコンパイラではインポートライブラリを作成する際に、plugin.defというファイルからplugin.libを作成しました。plugin.defはBlenderの「plugins」-「include」フォルダに入っています。

LCCでは、plugin.expというファイルを使用してpluginlcc.libを作成します。(本来はこれもplugin.libという名前でいいのですが、以下の手順でMicrosoftのコンパイラ用のものと同じ名前になると非常に紛らわしいので、このような名前にしてみました)

plugin.expファイルは普通のテキストファイルで、内容はplugin.defと似ています。
blender.exe
_mallocN
_callocN
_freeN
_mallocT
_callocT
_freeT
_hnoise
_hnoisep
_turbulence
_turbulence1
_allocImBuf
_dupImBuf
_freeImBuf
_converttocmap
_saveiff
_loadiffmem
_loadifffile
_loadiffname
_testiffname
_onehalf
_onethird
_halflace
_half_x
_half_y
_double_x
_double_y
_double_fast_x
_double_fast_y
_ispic
_dit2
_dit0
_scaleImBuf
_scalefastImBuf
_scalefieldImBuf
_scalefastfieldImBuf
_de_interlace
_interlace
_gamwarp

このファイルはplugin.DEFファイルを修正して手作業で作成することもできますが、Microsoftのコンパイラ用にインポートライブラリを作成してあれば、それを元に作成することもできます。

ちなみに、LCC用のpluginlcc.libとMicrosoft用のplugin.libは同じ拡張子ですが互換性がありません。同様に、Microsoftのコンパイラ用のplugin.libを作成する際にplugin.expというファイルが作成されますが、LCCで使用するものとは中身は全く別のものです。

Microsoftのコンパイラ用plugin.libからplugin.expを作成します。あらかじめコマンドを実行する場所にplugin.libをコピーしておきます。今回は「C:\blender\plugins\texture」です。
pic090430_01.jpg

コマンドプロンプトを起動し、以下のコマンドを実行します。

cd C:\blender\plugins\texture
pedump /EXP plugin.lib >plugin.exp

ここで、作成したplugin.expファイルをテキストエディタで開いてみると、一番最初の行が「blender.DLL」となっています。この部分はBlenderの実行ファイルの名前になっている必要がありますので「blender.exe」に修正します。
pic090430_02.jpg pic090430_03.jpg

plugin.expからpluginlcc.libを作成するには、以下のようにします。

buildlib plugin.exp pluginlcc.lib

以上でコンパイルのために必要なファイルがそろいました。
pic090430_04.jpg

コンパイルのために実行するコマンドは以下のようになります。

lcc -Ic:\blender\plugins\include clouds2.c
lcclnk -dll -nounderscores clouds2.obj c:\blender\plugins\include\tex.def pluginlcc.lib


一つ目のコマンドでclouds2.objというオブジェクトファイルを作成し、2つ目のコマンドはリンクを行ってDLLファイルを作成します。
pic090430_05.jpg pic090430_06.jpg
pic090430_07.jpg


○MinGWでのテクスチャプラグインのコンパイル
LCCの場合と同じく、MinGWもファイルをインストールするだけでなく、Windowsの環境変数「PATH」にMinGWの実行ファイルの入っている場所(通常は、C:\MinGW\bin)を追加しておく必要があります。

LCCの場合と同じように、以下のような状況を想定してコンパイルを行います。
  1. Blenderの「plugins」フォルダを「C:\blender」というフォルダにコピーします。
  2. コンパイルの対象は、「texture」フォルダにあらかじめ入っているclouds2.cとします。
  3. tex.defファイルを「include」フォルダに置きます。
MinGWでのコンパイルでは、tex.defファイルの内容を一部修正する必要があります。LCCで使用しているものをそのまま使うと、コンパイル時に以下のようにエラーが表示されます。
Cannot export LibMain@12: symbol not defined
collect2: ld returned 1 exit status
pic090430_16.jpg

とりあえず、問題のある部分を削除してしまえば、コンパイルが完了するようになるようです。
LibMain@12
この2行目の部分を削除します。
pic090430_08.jpg pic090430_09.jpg

・インポートライブラリの作成
MinGWでは、インポートライブラリは拡張子「.lib」ではなく、「.a」となります。さらに、ファイル名の頭が「lib」となるようにします。コマンドプロンプトを起動し、「plugins」-「include」フォルダに移動します。

cd \blender\plugins\include

以下のコマンドを実行し、libplugin.aファイルを作成します。

dlltool --input-def plugin.def --output-lib libplugin.a --dllname blender.exe

以上でコンパイルを行う準備の完了です。MinGWでのコンパイルでは、plugin.h、util.hを修正する必要はないようです。
pic090430_10.jpg

「plugins」-「texture」フォルダに移動します。

cd \blender\plugins\texture

以下のコマンドでコンパイルを行います。

gcc -I..\include -c clouds2.c
gcc -shared -o clouds2.dll ..\include\tex.def clouds2.o -L..\include -lplugin

一つ目のコマンドでオブジェクトファイルを作成し、2つ目のコマンドでリンクを行いDLLファイルを作成します。ちなみに、「-L」でリンクに使用するインポートライブラリの場所を指定し、「-l」でインポートライブラリの名前を指定します。このとき頭の「lib」と拡張子「.a」は省略します。
pic090430_11.jpg pic090430_12.jpg

ただし、このようにしてできたDLLファイルを使用する場合、初回にBlenderから読み込む際にエラーが起こりますが、Blenderを終了せずにそのまま再度プラグインをロードすると、2回目以降は普通に読み込めるようになります。
pic090430_14.jpg pic090430_15.jpg

Microsoftのコンパイラ、LCCコンパイラでは、このようなことは起こらないようですので、気になるようでしたらそれらのコンパイラを使うようにしてください。
posted by mato at 23:34| Comment(0) | Blender | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。