error LNK2019: 未解決の外部シンボル

linecacheがビルドできない原因だが、未だによく分っていない。

:
trace_nums.obj : error LNK2019: 未解決の外部シンボル _ruby_eval_tree_begin が関数 _lnums_for_str で参照されました。
trace_nums.obj : error LNK2019: 未解決の外部シンボル _ruby_in_eval が関数 _lnums_for_str で参照されました。
:
Ruby mswin32拡張ライブラリィMSVCR80版ビルド覚書き No.4


rubyをビルドした際に出来たランタイムのmsvcr80-ruby18.defを見ると

ruby_eval_tree DATA
ruby_eval_tree_begin DATA
:
ruby_in_compile DATA
ruby_in_eval DATA

と、"_"アンダースコア無しの名前になっている。ランタイムは正しくエクスポートされているはずだ。
ならば、とコンパイルで出来たtrace_nums.objのシンボルをダンプしてみると、

>dumpbin /SYMBOLS trace_nums.obj

Microsoft (R) COFF/PE Dumper Version 8.00.50727.762
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file trace_nums.obj

File Type: COFF OBJECT

COFF SYMBOL TABLE
000 006DC627 ABS    notype       Static       | @comp.id
:
:
1A4 00000000 SECT79 notype ()    Static       | _lnums_for_str
1A5 000000AB SECT79 notype       Label        | $LN5
1A6 00000000 UNDEF  notype ()    External     | _rb_exc_raise
1A7 00000000 UNDEF  notype       External     | _ruby_eval_tree_begin
1A8 00000000 UNDEF  notype       External     | __imp__ruby_errinfo
1A9 00000000 UNDEF  notype ()    External     | _rb_compile_string
1AA 00000000 SECT7A notype       Static       | .rdata
    Section length   12, #relocs    0, #linenums    0, checksum 13998BC9, selection    2 (pick any)
1AC 00000000 SECT7A notype       External     | ??_C@_0BC@ILHNLLHL@?$CInumbers_for_str?$CJ?$AA@ (`string')
1AD 00000000 UNDEF  notype       External     | _ruby_in_eval
1AE 00000000 UNDEF  notype       External     | __imp__rb_thread_critical
1AF 00000000 UNDEF  notype ()    External     | _rb_string_value
1B0 00000000 UNDEF  notype       External     | __imp__ruby_nerrs
1B1 00000000 UNDEF  notype ()    External     | _rb_ary_new
1B2 00000000 SECT7B notype       Static       | .text

と、確かにアンダースコア付きのシンボルを参照している。更に"__imp__"がプレフィクスに付いているのもあるが、問題にはなっておらず、あくまでエラーに関係しているのは"_ruby_eval_tree_begin"と"_ruby_in_eval"なのも解せないが、それにしてもこれだとリンクには失敗しそうな気がする。

おかしいことが起きているという事象を見ることが出来ただけ前に進んだが、問題はこれを「どう直すか」だよな。
さて、もう一息?

追記: dumpbinでmsvcr80-ruby18.libのエキスポートを確認する。

>dumpbin /EXPORTS msvcr80-ruby18.lib

Dump of file msvcr80-ruby18.lib

File Type: LIBRARY

     Exports

       ordinal    name

                  _GetCurrentThreadHandle
                  _Init_Array
                  _Init_Bignum
:
                  _ruby_eval_tree
                  _ruby_eval_tree_begin
:
:
                  _ruby_in_compile
                  _ruby_in_eval
:

やはり、というかアンダースコアは付いて当たり前であり、正しい名前でエクスポートされている。("_":アンダースコアは問題の本質では無いということだ)

であれば(正しいシンボル名を参照しているはずなのに)、なぜリンクに失敗するのか?