小田@QNES です。

実は、まだ解決していません(^^;

---
On Fri, 21 Aug 1998 14:13:36 +0900
KIMURA Koichi <kkimura / pure.cpdc.canon.co.jp> wrote:
> 木村です。
> 思い出した範囲で書いていきます
ありがとうございます。

> >libruby.lib をリンクしたときと、ruby.lib をリンクしないように
> 
> libruby.libは、「rubymw.dllを作らずに、単一のruby.exeですませる
> ときに使う」ライブラリで、「ruby.libは最終的にruby.libを作るとき
> にできるおまけみたいな」ライブラリだったとおもいます。つまり、拡張
> DLLとリンクするには条件があっていません。
> 
> makefileをそのまま使うと通常は
> 
>     ruby.exe
>     rubymw.dll
> 
> と二つのファイルを作ります。拡張DLLを作るときのリンクで必要になる
> のは rubymw.dllを作成したときに一緒にできたライブラリだったと思い
> ます。
> 
> makefileのruby.exeのルールのところににある
> 
>  $(CC) $(LDFLAGS) $(MAINOBJ) -o ruby.exe rubymw.lib -link /STACK...
>                                          ^^^^↑^^^^
>                                         これです。
> 
> >LIBC.lib(dllcrt0.obj) : error LNK2005: __amsg_exit はすでに LIBC.lib(crt0.obj)
> >で定義されています
> 
> この辺のエラーは、先に書いた条件の問題によるものです。
たしかに、rubymw.lib でほとんどの未定義エラーは無くなりました。
しかし、一部、export 定義をしてないインタフェース関数があるようです。
具体的には、ruby.def にexport定義があるのですが、ここに記述がない
関数(例えば、str2cstr関数等)があります。
C言語プログラム−ruby間のインタフェース関数の一覧表は、無いのでしょうか?
# 本来は、ruby.def の記述がこの一覧表にあたるのですが(^^;
 
> それと、実に悩ましい問題があって、一度目のbuildは絶対に失敗した
> と思います。なぜかというと、rubymw.dllを作るタイミングは各種拡張
> モジュールを作成した後なのに、拡張モジュールのDLLを作成するとき
> にはrubymw.libが存在しないので「必ず」リンクで失敗するのですね。
> これが。一度rubymw.libができてしまえば問題はなくなるんですが。
そうですね。
でも、これはmake順序がおかしいのが原因のような気がします。
README.ext.jp の記述によると、ext/Setup に記述してあるものは
静的にリンクされるので、make順としては、

 静的リンク拡張モジュール
 -> rubymw.dll(& rubymw.lib)
 -> 動的リンク拡張モジュール(rubymw.lib使用)
 -> ruby.exe

の順に作成されるのが通常シーケンスだと思いますが、実際は

 動的リンク拡張モジュール(rubymw.lib使用)
 -> rubymw.dll(& rubymw.lib)
 -> ruby.exe

となって、ext/Setup に記述されている静的リンク拡張モジュールが
動的リンク拡張モジュール扱いでmakeされいます。

この辺りを修正するにはどのファイルを修正すればいいのでしょうか?
ext/extmk.rb あたりでしょうか。
# でも、rubyの記述はまだ理解できてません(^^;;;

∪*****/\*****\/*****/\*****∪
  Koji Oda  NEC Software Kyusyu
  1st Development Department
   Based Software Division
  E-Mail:oda / bsd1.qnes.nec.co.jp
∩*****/\*****\/*****/\*****∩