こいつの続き。とりあえず、Visual C++ 2005 と Windows XP (または Windows Server 2003) との組み合わせにおいて固有の仕様であることは分かった。
で、とりあえず、マニフェストというのを定義して設定する必要があり、試しに作ったテストプログラムのビルドログを眺めてみたところ、それを行うには以下のことをすればいいんじゃないかということがなんとなく解ってきた。
/manifest
オプションと /manifestfile
オプションを指定し、マニフェスト定義ファイルを生成する。mt.exe
を呼び出し、マニフェストをオブジェクトに埋め込む。そこで、perl Makefile.PL
して生成された Makefile に対して、$(LD)
を呼び出している行を、以下のような内容に書き換えてみた。
$(LD) -out:$@ -MANIFEST -MANIFESTFILE:$@.intermediate.manifest $(LDDLFLAGS) $(LDFROM) $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) -def:$(EXPORT_LIST) $(MT) -outputresource:$@;#1 -manifest $@.intermediate.manifest -nologo
ちなみに $(MT)
の為に、最初のほうに以下の行も入れた。
MT = mt
で、この状態で nmake
して nmake install
してみたんだが、結局状況変わらず。もちろん、%WINDIR%\system32
ディレクトリ下にコピーしていた msvc?80.dll
ファイルの類はすべて削除していたんだが、「MSVCR80.DLL が見つからんよ」というエラーが出てこけてしまう。
いったい何がまずいんだろう。。。
動きますた。DLL の場合、リソース ID は 2 を選択しなければならないんだそうです。
つか、「mt.exe nmake」でぐぐったら一発で↑この記事が見つかったよ。最初からそうしてればよかった。。。
ちうわけで、Makefile は以下のように修正。。。
$(LD) -out:$@ -MANIFEST -MANIFESTFILE:$@.intermediate.manifest $(LDDLFLAGS) $(LDFROM) $(OTHERLDFLAGS) $(MYEXTLIB) $(PERL_ARCHIVE) $(LDLOADLIBS) -def:$(EXPORT_LIST) $(MT) -outputresource:$@;2 -manifest $@.intermediate.manifest -nologo
よーするに mt.exe
呼び出し時のオプション -outputresource:$@;#1
としてたのを、-outputresource:$@;2
に直しただけです。番号記号 #
もいらんかった。
これで、ActivePerl に Win32API::MIDI モジュールをインストールすることができました。こいつも ActivePerl で動作確認しますた。
で、こんな場当たり的な対策をモジュールインストールするたびにやってたんではキリがないので、 (←嘘、直すなら h2xs
が Makefile.PL
生成する際に行っている処理 (ってどこに書いてあるんだ? h2xs.bat
本体でいいのかしら?)Makefile.PL
が呼び出している ExtUtils::MakeMaker
[LINK] モジュールだ) に対するパッチを書こうと思う。これは出来次第近いうちに公開するつもり。
セコメントをする