Ruby拡張ライブラリをビルド

前提

ActiveScriptRuby(MSVC++6)に対して、MSVC++2005 Express Edition で拡張ライブラリをビルドという 変則的なことをします。だって拡張ライブラリのためだけにRuby丸ごとビルドっていやですもの。

環境構築

ASRとそのヘッダをインストール。 MSVC++ExpressEditionこちらに 従ってプラットフォームSDKをインストールしたりもろもろの設定。

MSVCR80.dll問題

VC++2005 Express でビルドした実行ファイルは環境によっては「MSVC80.dllがない」と言われる。 SxSという仕組みのため昔ながらのDLL直置きでは対処できない。 VCの入ってない環境にはMicrosoftVisualC++2005再頒布可能パッケージを使用。

マニフェストファイルに依存するDLLの場所やバージョンが書かれているそうで、IDEでビルドするとその マニフェストファイルはEXEに埋め込まれるのだがnmakeだと埋め込まれないらしい。 (未調査:IDEでビルドしてもDebugビルドだとだめ?Releaseビルドだと動く)

で、ようやく結論だけどもこちら のまねをして、古いMSVCでビルドされたruby.exeと同じパスに以下の内容のruby.exe.manifestを置けばOk。 ruby.exeがライブラリのsoをインクルードするときにMSVCR80.dllの場所が分からなくなるようだ。

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
   <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='ほげほげ' 
        processorArchitecture='x86' publicKeyToken='ほげほげ' />
    </dependentAssembly>
  </dependency>
</assembly>

ほげほげの部分は今後MSVCのバージョンがあがると変わるだろう。手元のものの場合は version='8.0.50608.0' publicKeyToken='1fc8b3b9a1e18e3b' でよさそう。

うーむ。バッドノウハウの塊だ。素直にMinGWを使えと言うことかなあ。