[exerb-dev:0576] Visual C++ 2008/2010でビルドした拡張ライブラリを使うとSEGV (was: Re: REXMLでXMLドキュメントを処理するスクリプトがSEGV)

Back to archive index

pegacorn subsc****@gmail*****
2011年 12月 18日 (日) 23:01:04 JST


結論から言うと、動きました!
以下、やったことを書きます。

2011年12月18日16:09 pegacorn <subsc****@gmail*****>:
> 2011年12月18日10:25 Masahiro Kitajima <katon****@katon*****>:
>>> >    ruby 1.8.7 (2011-06-30 patchlevel 352) [i386-mswin32]
>>>
>>> 今手元にあるのは Visual C++ 2010 でビルドしたものですが、
>>> 別のマシンで Visual C++ 2008 でビルドしたものでも同様でした。
>>
>>  私のは VC++ 6.0 でビルドしています。

(1)ruby, ExerbコアをVisual C++ 2008でビルド
→EXE自体が起動しない
(2)[exerb-dev:0570]の村瀬さんのパッチを当てる
→EXEは起動するようになったが、requireでSEGV(振り出し)
(3)Exerbコアのバージョンをrubyと同じ1.8.7-p352にあげる
→変わらずSEGV
(4)以下のパッチを当てる
→REXMLを使ったサンプルスクリプトが動いた!

VC++2008では「msvcr90-ruby18.dll」、VC++2010では「msvcr100-ruby18.dll」のように
rubyのDLL名が変わるので、(4)は必須だと思います。
それ以外は必要なのかどうかわかりません。

(4)のパッチ:
--- exerb-5.3.0/src/exerb/exerb.cpp.ORG	2010-12-26 08:11:42.000000000 +0900
+++ exerb-5.3.0/src/exerb/exerb.cpp	2011-12-18 21:35:48.819475200 +0900
@@ -552,7 +552,7 @@
 #ifdef RUBY19
 	::exerb_replace_import_dll_name(&info, "msvcrt-ruby19.dll",
self_filename); // for an extension library on dynamic linked ruby
 #else
-	::exerb_replace_import_dll_name(&info, "msvcrt-ruby18.dll",
self_filename); // for an extension library on dynamic linked ruby
+	::exerb_replace_import_dll_name(&info, "msvcr90-ruby18.dll",
self_filename); // for an extension library on dynamic linked ruby
 	::exerb_replace_import_dll_name(&info, "cygwin-ruby18.dll",
self_filename); // for experiment
 	::exerb_replace_import_dll_name(&info, "cygruby18.dll",
self_filename); // for experiment
 #endif


-- 
pegacorn




exerb-developer メーリングリストの案内
Back to archive index