2011-07-05 8 views
8

ruby ​​website (1.9.2-p180)의 안정된 루비 소스 코드를 다운로드하여 MinGW 4.5.2-TDM과 MSYS가 설치된 Windows에서 컴파일했습니다. 컴파일하려면 sh configuremake을 실행했습니다. 나는 msvcrt-ruby191.dlllibmsvcrt-ruby191.dll.a을 예상대로 사용합니다. 루비의 DLL에 연결, g++로 컴파일이 코드는 루비 1.9에서 작동하지 않지만 루비 1.8에서 작동하는 이유는 무엇입니까?

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

I : 그럼이 코드를 썼다.

<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. 

문제는 다음과 같습니다 : 루비 1.8.7와 연결하면 동일한 코드가 완벽하게 작동 내가 실행 파일을 실행하면,이 오류 메시지를 받았습니다. 여기서 뭐가 잘못 됐니?

+0

gdb 백 트레이스 란 무엇입니까 – rogerdpack

답변

6

,이에 초기화를 확장하는 시도하십시오 :

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() 
} 

초기화 과정은 그래서 별도의 중첩 된 블록 { .. } 지금 필요한 블록의 RUBY_INIT_STACK 매크로를 추가, 1.8 및 1.9 버전 사이에 변경되었습니다.

+0

감사합니다. 이제 작동합니다! –

+0

C에서 루비 초기화에 대한 실제 문서를 찾을 수 없지만 루비 코어 및 그 주변에 몇 가지 예가 있습니다. http://www.ruby-forum.com/topic/462007 http://www.ruby-forum.com/topic/184811 http://fossplanet.com/f14/questions-about-embedding-ruby-1- 9-a-24109/또는 google.com/codesearch?q=ruby_init – osgx

관련 문제