もきもき3D

アクセスカウンタ

zoom RSS 本末転倒極めり(゚д゚)クワッ lightwave用プラグインをMinGWで作る。その導入。

<<   作成日時 : 2007/03/24 13:18   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

なんか無性に、入れたい;;´д`) 作りたい;;´д`)ハァハァ
となったのでLWのプラグインDLLを作れる環境を整えてみよう、と。
まず、VC++2005無料版+SP1+W32用Lib(?)を1G分DLした後に、UnrealはMinGWだったしプラグイン用ならそれで十分じゃね?とMinGWを導入(゜∀゜)
大規模な支援LIBやIDEが無いとはいえ17M程度のDLで済むってのがなんとも。
まぁドキュメントが無いに等しいっぽいから、C/C++に関する基本的な資料を持っている事が前提になるけど。

http://sourceforge.net/projects/mingw/
 取りあえず、ver5を謳うインストーラがあるけど、「DLと解凍、path設定をするだけのもの」っぽい。
 素直に使うとWindowsの「アプリのインスト/アンインスト」に無駄なエントリを作られそうだったからDLだけで終了させた。 実際、DLされる物はVer5でもなんでもない個別(機能)の圧縮ファイルだしね。 必要なファイルが判れば、個別にDLした方が無駄な介入を防げる(・з・)
gcc-core-3.4.2-20040916-1.tar.gz (コンパイラ本体、必須)
mingw-runtime-3.11.tar.gz (ヘッダ類、必須)
binutils-2.16.91-20060119-1.tar.gz (補助ツール、必須)
w32api-3.8.tar.gz (WIN32APIラッパ? LWプラグイン作成って範疇では不要かも。)
mingw32-make-3.81-2.tar.gz (Make。UNIX系補助ツール(MSYSやcygwin?)を別途入れないならこれを使うしかなさげ。)
gcc-g++-3.4.2-20040916-1.tar.gz (C++用コンパイラ類。Cだけでやるなら不要ぽい。)

 で、MinGWってディレクトリを掘って、DLしてきたファイルをLhmelt+tar32.dllで其処ルートにしてガガーっと解凍。
 ユーザ毎のpathにMinGW\binを足して一応完了?

 適当なディレクトリでHelloworld.cを書いて、そこからgccでコンパイルしても、includeがみつからねぇ、とか言われなかったし、大丈夫っぽい。

 次にLWSDKを適当な所にそのまま解凍(今回はC:\LWSDK〜)。

 LWSDK\sourceから↓を実行。
 SDKのmanの例では-O6が付いてるけど、最適化オプション「-O」は0〜3 or s だけみたいなので排除。 -O2をつけても↓の結果は変わらなかったしね。
 -I(path)でLWSDKのincludeの在りかを指定するけど、今回は単発なので「../inc〜」と相対pathで済ました。
gcc -c -D_MSWIN -D_X86_ -I../include servmain.c servdesc.c username.c startup.c shutdown.c

 次にライブラリ化。 同じ所で↓実行。
ar r libserver.a servdesc.o username.o startup.o shutdown.o

 一応、ここまでエラー無し。 正しいかは謎。

 次にmake。 unixに縁は無いし、各種アプリを作る為の汎用開発環境なんて考えてないので評判の悪いMinGW32-Makeをmakeに改名して使う。
 unixベースを考えるのは問題が出てからでよかろう、と(・з・)

 で、makefileを見様見真似で書いてみた。 SDKのmanの例は大昔の記録くさいし。
 〜FLAGSは纏めても良いんだけどLWSDKに纏わる物とコンパイラへのオプションで一応分けた。
----
LW_FLAGS = -D_MSWIN -D_X86_
LW_LIB = c:/LWSDK/lib/
LW_LIBS = $(LW_LIB)servmain.o $(LW_LIB)libserver.a
LW_INCL = c:/LWSDK/include
DEF = c:/LWSDK/source/serv.def
CFLAGS = -O2
TARG = box.p
OBJS = box.o

%.o: %.c
gcc $(LW_FLAGS) $(CFLAGS) -I$(LW_INCL) -c $<

$(TARG): $(OBJS)
dllwrap --def $(DEF) --dllname $@ $(OBJS) $(LW_LIBS) -o $@
----
 LW_INCLはパスを指定するものだから末尾に/は不要。
 LW_LIBは先に作成したLWSDKの基幹ライブラリを置いてるディレクトリ。 続くLW_LIBS内でファイル名と繋がるので、〜/lib/としておく。
 --def $(DEF)では、LWSDK/〜/serv.defを使用して、DLLとしてエクスポートするエントリを指定する。 基本的に単機能のプラグインがエクスポートするエントリ名は単一固定なのでSDKのものがそのまま使えるぽい。 複数機能を内包する場合の例は後々調べよう。

 コマンドプロンプトでカレントをLWSDKのサンプルディレクトリのBOX1に移動して、make。
 pathが通ってるのですんなり実行される。

 素のままではコンパイルもリンクも通るしLWへの登録/使用に問題はでなかったけど、コンパイル時に「 box.c:33: warning: initialization from incompatible pointer type 」を吐いてるので、BOX1.cの
ServerRecord〜
{ LWMODCOMMAND_CLASS, "Tutorial_Box1", Activate },
〜};

{ LWMODCOMMAND_CLASS, "Tutorial_Box1", (ActivateFunc *)Activate },
の様に修正。 ワーニングを吐かなくなった。
 これも問題なくLW上で使えた。

 他のサンプルのテストは追々やろう。
-----
mingw-runtime-3.11.tar.gzは致命的なバグ持ちらしい事を見かけたから一つ前の版の方がいいかも?
-----
mingw-runtime-3.12が出た。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
本末転倒極めり(゚д゚)クワッ lightwave用プラグインをMinGWで作る。その導入。 もきもき3D/BIGLOBEウェブリブログ
文字サイズ:       閉じる