[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