From: pegacorn Date: 2007-10-13T00:42:36+09:00 Subject: [ruby-list:44108] Re: Windowsアプリにrubyを組み込んだときのエラーメッセージ ----Next_Part(Sat_Oct_13_00_39_08_2007_424)-- Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit From: "きむらこういち" Date: Fri, 12 Oct 2007 22:21:14 +0900 Message-Id: /~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > extern VALUE ruby_errinfo; // eval後のエラーメッセージで必要$ > > これですね。 > > __declspec(dllimport) / __declspec(dllexport) が正しくついていないと、 > シンボルとしては見えるけど値をとろうとしても取れないという状態になります。 > ruby.h を include していれば普通はそれを気にしないでよいようにできてませんでしったけ? そうなっていると思います。 ./win32/config.h:#define RUBY_EXTERN extern __declspec(dllimport) ./ruby.h:#include "config.h" ./ruby.h:RUBY_EXTERN VALUE ruby_errinfo; > 詳しくまとめるかどうかはともかく、「忘れずに ruby.h を include しとけ、な?」 > くらいは書いておいてもいいかもしれないですね。 加えて保険として、エクスポートするデータシンボルには DATA 属性?を 付けておくのはどうでしょうか。 これを付けてエクスポートしておくと、__declspec(dllimport) 無しでは リンクできなくなるので。 EXPORTS ruby_errinfo DATA -- pegacorn ----Next_Part(Sat_Oct_13_00_39_08_2007_424)-- Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="mkexports.rb.patch" Index: mkexports.rb =================================================================== --- mkexports.rb (revision 13498) +++ mkexports.rb (working copy) @@ -7,13 +7,25 @@ objs = ARGV.collect {|s| s.tr('/', '\\')} IO.foreach("|dumpbin -symbols " + objs.join(' ')) do |l| next if /^[0-9A-F]+ 0+ UNDEF / =~ l - next unless l.sub!(/.*\sExternal\s+\|\s+/, '') - if l.sub!(/^_(?!\w+@\d+$)/, '') + case l + when /.*\(\)\s+External\s+\|\s+/ + is_data = false + when /.*\sExternal\s+\|\s+/ + is_data = true + else + next + end + l.sub!(/.*\sExternal\s+\|\s+/, '') + if l.sub!(/^_/, '') next if /@.*@/ =~ l || /@[0-9a-f]{16}$/ =~ l + l.sub!(/@\d+\s*$/, '') + elsif l.sub!(/^@/, '') + l.sub!(/@\d+\s*$/, '') elsif !l.sub!(/^(\S+) \([^@?\`\']*\)$/, '\1') next end - SYM[l.strip] = true + l.strip! + SYM[l] = is_data end exports = [] @@ -23,7 +35,14 @@ exports << "Library " + $library end exports << "Description " + $description.dump if $description -exports << "EXPORTS" << SYM.keys.sort +exports << "EXPORTS" +SYM.keys.sort.each do |sym| + if SYM[sym] + exports << sym + ' DATA' + else + exports << sym + end +end if $output open($output, 'w') {|f| f.puts exports.join("\n")} ----Next_Part(Sat_Oct_13_00_39_08_2007_424)----