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 :
やはり、というかアンダースコアは付いて当たり前であり、正しい名前でエクスポートされている。("_":アンダースコアは問題の本質では無いということだ)
であれば(正しいシンボル名を参照しているはずなのに)、なぜリンクに失敗するのか?