@ledsun blog

無味の味は佳境に入らざればすなわち知れず

simstringとswigの問題の切り分け

Rubyからsimstringを使うにはSWIGが必要です。 - @ledsun blog でビルドしたsimstring gemをRubyから実行時に次のエラーが出ていました。

ledsun@MSI:~/pubdictionaries►ruby -e 'require "simstring"'
<internal:/home/ledsun/.rbenv/versions/3.0.1/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in `require': /home/ledsun/.rbenv/versions/3.0.1/lib/ruby/site_ruby/3.0.0/x86_64-linux/simstring.so: undefined symbol: Init_simstring - /home/ledsun/.rbenv/versions/3.0.1/lib/ruby/site_ruby/3.0.0/x86_64-linux/simstring.so (LoadError)

上記エントリではやりなおしたら出来ちゃいました。 もうちょっと原因を絞り込みます。 結論は、--swigオプション付きのprepare.shで生成するexport_wrap.cppコンパイルしないと上記エラーがでます。

https://github.com/chokkan/simstring/blob/d4dca6813cd134819af57bd2340a197dc9e855ec/swig/ruby/prepare.sh

#!/bin/sh
# $Id:$

ln -s ../export.cpp
ln -s ../export.h
ln -s ../export.i

if [ "$1" = "--swig" ];
then
    swig -c++ -ruby -o export_wrap.cpp export.i
fi

prepare.sh--swigオプションをつけると、swigコマンドをつかってexport_wrap.cppを生成します。 export_wrap.cppの中にInit_simstring関数の定義があります。

SWIGEXPORT void Init_simstring(void) {
  size_t i;

  SWIG_InitRuntime();
  mSimstring = rb_define_module("Simstring");

  SWIG_InitializeModule(0);
  for (i = 0; i < swig_module.size; i++) {
    SWIG_define_class(swig_module.types[i]);
  }