From: Jared Richardson Date: 2006-03-25T10:58:53+09:00 Subject: Re: C extensions question Also, I forgot to add, in order for this to work, invoke with these options: ruby -r mkmf xtconf.rb --with-ingres-include="/opt/Ingres/IngresII/ingres/files/" --with-ingres-lib="/opt/Ingres/IngresII/ingres/lib/" "Jared Richardson" wrote in message news:Yi1Vf.44009$915.14388@southeast.rr.com... >I finally got this thing working so I thought I'd share the answer, even >though it was a simple problem (once I found it.) :) > > I was already generating my Makefile with extconf.rb but I hadn't gotten > it to answer "yes" to any of the have_library or find_libary calls. I did > have it working for have_header. I should've focused on that have_library > that answered "no", but I thought that since the original C samples could > run with the libraries in the LD_LIBRARY_PATH environment variable that > the Ruby code would be okay. It wasn't. :) > > It turns out that I wasn't using the right library name. The include was > called "iiapi.h" and the compiled library was named libiiapi.a (static) > and libiiapi.1.so (dynamic). However the name of the library seems to be > "ingres". I'm pretty sure I tried using "ingres" early in the debugging > cycle, but it appears that either I didn't or that I had the environment > messed up at the time. > > I haven't done anything "real" with the resulting code yet, but I can call > into the ingres library without a segmentation fault, so I'm going to call > it good and go take a break. :) > > I'm pasting in my extconf.rb for future reference. > > ----- > require 'mkmf' > > dir_config("ingres") > have_header("iiapi.h") > have_library("ingres") > > $CFLAGS = " -g -Dint_lnx -O " > incdir = ENV["II_SYSTEM"] + "/ingres/files" > $CFLAGS += "-I#{incdir}" > libdir = ENV["II_SYSTEM"] + "/ingres/lib" > $LDFLAGS += "-L#{libdir}" > $LDFLAGS += " -lingres -lpthread -lm -lc -lcrypt -ldl -lgcc_s" > > create_makefile("Ingres") > ----- > > Thanks for the suggestions and help. > > Jared > http://jaredrichardson.net > > > -------------------------- > --- Original Message ---- > -------------------------- > > > Hi all, > > I haven't done any "real" work in C in nearly 10 years and I'm still > learning Ruby, so it's quite possible that I'm just doing something dumb, > but I'm stuck here. I'm trying to call Ingres database code from Ruby, so > I'm writing some C extensions. > > I have Ruby calling into C code. Very easy and very nice. > > I have Ingres sample code (which is C) compiling and running fine. > > However, when I try to invoke Ingres code from any of my C code and run it > (from Ruby), I get a seg fault. > > It feels like Ruby can't see the Ingres libraries but the code samples > don't > seem to having any problems. I suspect I'm missing something simple... > > Do you need to do any special wrapping or declaring of code that isn't > touched from within your Ruby? I've been through the Pickaxe book and > several online samples/tutorials and I don't see that it's needed... but > then again, my code isn't running. :) > > Here's my code as it is now... any hints or clues? > > #include "ruby.h" > # include > # include > > static VALUE cIngres; > > static VALUE ii_exec(VALUE self) { > printf("\n\nExec was run from within the Ruby code \n\n"); > IIAPI_INITPARM initParm; > printf("one\n"); > IIapi_initialize( &initParm ); > printf("two\n"); > return Qnil; > } > > void Init_Ingres() { > cIngres = rb_define_class("Ingres", rb_cObject); > rb_define_method(cIngres, "exec", ii_exec, 0); > } > > > Thanks! > > Jared > http://jaredrichardson.net > > >