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 <stdio.h>
# include <iiapi.h>

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