[cffi-devel] C compilation error on sizeof structure

Mirko Vukovic mirko.vukovic at gmail.com
Fri Sep 21 20:27:32 UTC 2012


Hello,

cffi-grovel is failing to compile a file.  I am not certain whether
the problem is the way I am using cffi-grovel (most likely), my utter
lack of knowledge of C, or something else.  Also I noticed recent
activity by Liam Healy on linking to structures (which I did not
closely follow), and I wonder if it has any bearing on this.

I want to link CL to "triangle", a library for two dimensional
triangulation and meshing
(http://www.cs.cmu.edu/~quake/triangle.html).

The interface to the main subroutine is defined in "triangle.h" which
defines a structure "triangulateio":

struct triangulateio {
  REAL *pointlist;                                               /* In / out */
  REAL *pointattributelist;                                      /* In / out */
  int *pointmarkerlist;                                          /* In / out */
  int numberofpoints;                                            /* In / out */
  int numberofpointattributes;
  ....
  }

I defined a groveller lisp file libtriangle-unix.lisp with the
following contents:

(define REAL "double")
(include "/home/mv/external-libraries/c-code/triangle/triangle.h")

(cstruct triangulateio "triangulateio")

(Note that I did not specify any fields.  I saw a post on the web
suggesting that cffi would fill it in.  Is that correct?)

In the asd file, I have
  :components ((:file "cl-triangle-package-def")
	       (cffi-grovel:grovel-file "libtriangle-unix")))


When I load the system, a C file is generated in ~/.cache/..., and
this file fails to compile, on the statement containing
"sizeof(triangulateio)"

Here are the C file contents:

#define REAL double
#include "/home/mv/external-libraries/c-code/triangle/triangle.h"

#include <grovel/common.h>

int main(int argc, char**argv) {
  FILE *output = argc > 1 ? fopen(argv[1], "w") : stdout;
  fprintf(output, ";;;; This file has been automatically generated by "
                  "cffi-grovel.\n;;;; Do not edit it by hand.\n\n");
  fprintf(output, "(cl:in-package #:CL-TRIANGLE)\n\n");

  /* cstruct section for TRIANGULATEIO */
  fprintf(output, "(cffi:defcstruct (");
  fprintf(output, "triangulateio");
  fprintf(output, " :size %i)", sizeof(triangulateio));   /* Line 20 */
  fprintf(output, ")\n");
  ...

The error message is

libtriangle-unix.c: In function ‘main’:
libtriangle-unix.c:20: error: ‘triangulateio’ undeclared (first use in
this function)

The same error happens if I modify the C file to explicitly declare
the structure there.

Two questions:
- Is my procedure incorrect (the grove lisp file, asdf specification)
- I don't see why triangulateio is undefined on line 20.  But that may
be my lack of C knowledge.

Thanks,

Mirko




More information about the cffi-devel mailing list