本当は解決済みだった(LNK2019: 未解決の外部シンボル)

trace_nums.cだが、取りあえずコンパイルを通すことだけは出来た。

変更点は以下の通り(trace_nums.c.diff)

42,43c42,43
< NODE *ruby_eval_tree_begin;
< int ruby_in_eval;
    • -
> extern NODE *ruby_eval_tree_begin; >

ちょっと冷静になればruby_eval_tree_beginとruby_in_evalが外部で既に宣言されているのはすぐに解ったはずだが、「未解決」という言葉に惑わされてこんなに回り道してしまった。Cでの経験の少なさが全てだろうな。

あれほど通らなかったビルドはあっさりと通るようになった。

E:\ruby_build_image\linecache-0.43>nmake all clean

Microsoft(R) Program Maintenance Utility Version 8.00.50727.762
Copyright (C) Microsoft Corporation.  All rights reserved.

        cl -nologo -I. -Ie:/ruby/lib/ruby/1.8/i386-mswin32_80 -Ie:/ruby/lib/ruby/1.8/i386-mswin32_80
 -Iext -MD   -O2b2xty- -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -c -Tcext/trace_nums.c

trace_nums.c
        cl -nologo -LD -Fetrace_nums.so trace_nums.obj msvcr80-ruby18.lib  oldnames.lib user32.lib a
dvapi32.lib shell32.lib ws2_32.lib   -link -incremental:no -debug -opt:ref -opt:icf -dll -libpath:".
" -libpath:"e:/ruby/lib"  -implib:trace_nums-i386-mswin32_80.lib -pdb:trace_nums-i386-mswin32_80.pdb
 -def:trace_nums-i386-mswin32_80.def
   ライブラリ trace_nums-i386-mswin32_80.lib とオブジェクト trace_nums-i386-mswin32_80.exp を作成中
        mt -nologo -manifest trace_nums.so.manifest -outputresource:trace_nums.so;2

E:\ruby_build_image\linecache-0.43>nmake install

Microsoft(R) Program Maintenance Utility Version 8.00.50727.762
Copyright (C) Microsoft Corporation.  All rights reserved.

        cl -nologo -I. -Ie:/ruby/lib/ruby/1.8/i386-mswin32_80 -Ie:/ruby/lib/ruby/1.8/i386-mswin32_80
 -Iext -MD   -O2b2xty- -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -c -Tcext/trace_nums.c

trace_nums.c
        cl -nologo -LD -Fetrace_nums.so trace_nums.obj msvcr80-ruby18.lib  oldnames.lib user32.lib a
dvapi32.lib shell32.lib ws2_32.lib   -link -incremental:no -debug -opt:ref -opt:icf -dll -libpath:".
" -libpath:"e:/ruby/lib"  -implib:trace_nums-i386-mswin32_80.lib -pdb:trace_nums-i386-mswin32_80.pdb
 -def:trace_nums-i386-mswin32_80.def
   ライブラリ trace_nums-i386-mswin32_80.lib とオブジェクト trace_nums-i386-mswin32_80.exp を作成中
        mt -nologo -manifest trace_nums.so.manifest -outputresource:trace_nums.so;2
install -c -p -m 0755 trace_nums.so e:\ruby\lib\ruby\site_ruby\1.8\i386-msvcr80

しかし、正しいかどうかはまた別な問題。ひょっとしたら外部の変数を参照してはいけないのかもしれないし、trace_nums側でexternするのが正しいってことはあり得る訳だし作者の意図が分らない以上、推測でしかない。