Dear Gambit-List, I have the following problem:
I have a C header file that I use to include all the C files I need, and define a single function that transfers between C vectors and Scheme f64vectors. I have included this file in my "Scheme header" so I can compile a single file. Incidentally, I also include the C header (gsl_genx.h) in each Scheme module. Compilation with gsc goes just fine, but when I load the file with gsi, I get an error. Here are the files and the error:
************************************************** /home/joel/lisp/scm/genxic/gsl_genx> cat gsl_genx.h /* -*- mode:c -*- */ /* $Id$ */ /* */ /* gsl_genx.c */
#ifndef ___GSL_GENX #define ___GSL_GENX #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <gsl/gsl_vector.h> #include <gsl/gsl_matrix.h> #include <gsl/gsl_blas.h> #include <gsl/gsl_errno.h> /* C function for transferring vectors */ /* this could be better defined as a function-like macro */ int f64vector_length (___SCMOBJ); double f64vector_ref (___SCMOBJ, int); double * scm_vector_to_C (___SCMOBJ f64vec) { /* initialize the length of the vector */ int len = f64vector_length (f64vec); /* initializes the new vector */ double * newCvec = malloc (len*sizeof (double)); /* declare a counter */ int i; /* iterate over the length of the vector copying each object into the new vector */ for (i = 0; i<len; i++) { /* could be re-written using pointer arithmetic */ newCvec[i] = f64vector_ref (f64vec, i); } return newCvec; } #endif /home/joel/lisp/scm/genxic/gsl_genx> cat gsl_genx.scm ;; -*- mode:scheme -*- ;;$Id$ ;; ;; gsl_genx.scm
;; header file for GSL API (c-declare "#include "gsl_genx.h"") (include "gsl_structures.scm") (include "gsl_lalgebra.scm") (include "gsl_wrapper.scm") ;; end of gsl_genx.scm /home/joel/lisp/scm/genxic/gsl_genx> gsc gsl_genx.scm /home/joel/lisp/scm/genxic/gsl_genx> gsi gsl_genx *** ERROR IN ##main -- /home/joel/lisp/scm/genxic/gsl_genx/gsl_genx.o11: undefined symbol: gsl_matrix_get_row (load "gsl_genx") /home/joel/lisp/scm/genxic/gsl_genx> **************************************************
And the function with gsl_matrix_get_row (in gsl_structures.scm):
************************************************** (define gsl-row-vector ;; gets the row of matrix and sets it equal to a vector (c-lambda (gsl-vector* gsl-matrix* int) gsl-vector* "gsl_matrix_get_row (___arg1, ___arg2, ___arg3); ___result_voidstar = ___arg1;")) **************************************************
Now, the obvious problem is that the symbol *is* defined in gsl/gsl_matrix.h. If I comment the function that uses gsl_matrix_get_row, then the next one comes up with the same error. I've looked at the resulting C file (gsc -c gsl_genx.scm), and gsl_genx.h is included. What am I missing here?
An added note: i used a different (less logical) organizational scheme before, and I didn't have this problem.
I will again humbly point out that I know a lot more about Scheme than I know about C ;)
Thanks, Joel