Почему этот код не работает на ruby ​​1.9, но работает на ruby ​​1.8? - PullRequest
8 голосов
/ 05 июля 2011

Я скачал стабильный исходный код ruby ​​с сайта ruby ​​ (1.9.2-p180) и скомпилировал его в Windows с MinGW 4.5.2-TDM и MSYS. Для компиляции я запустил sh configure и make. Я получил msvcrt-ruby191.dll и libmsvcrt-ruby191.dll.a точно так, как ожидалось. Тогда я написал этот код:

#include <ruby.h>
int main() {
  ruby_init();
  rb_funcall2(Qnil, rb_intern("p"), 1, (VALUE[]){INT2FIX(0)});
  ruby_finalize();
}

Я скомпилировал с g++, ссылаясь на dll рубина. Когда я запустил исполняемый файл, я получил это сообщение об ошибке:

<main>: [BUG] Segmentation fault
ruby 1.9.2p180 (2011-02-18 revision 30909) [i386-mingw32]

-- control frame ----------
c:0002 p:---- s:0004 b:0004 l:000003 d:000003 CFUNC  :p
c:0001 p:0000 s:0002 b:0002 l:00120c d:00120c TOP
---------------------------
-- Ruby level backtrace information ----------------------------------------
ruby:0:in `p'

[NOTE]
You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.
For details: http://www.ruby-lang.org/bugreport.html


This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

Проблема в том, что тот же код отлично работает при соединении с ruby ​​1.8.7. Что здесь не так?

1 Ответ

6 голосов
/ 05 июля 2011

Пожалуйста, попробуйте расширить ваш init для этого:

int main(int argc,char *argv[]) {
  ruby_sysinit(&argc, &argv);
  {
    RUBY_INIT_STACK;
    ruby_init();
    ruby_init_loadpath();
    // ... code
    ruby_finalize();
  }
  return 0; //from main()
}

Процесс инициализации был изменен между версиями 1.8 и 1.9, поэтому добавление отдельного вложенного блока { .. } и макроса RUBY_INIT_STACK вблок нужен сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...