[Ecls-list] Handling C/C++ pointers in lisp code (Was "can't compile with g++")
Larry Clapp
larry at theclapp.org
Tue Mar 2 21:36:00 UTC 2004
On Mon, Mar 01, 2004 at 03:38:51PM +0100, Juan Jose Garcia-Ripoll wrote:
> > Okay. Recompile using -with-cxx and -with-ffi. Will do.
>
> If anything fails, please report it.
Well, it turns out that even with "extern "C" { ... }" around it,
clos_ensure_class() still causes problems for g++. I reconfigured
with --with-cxx, and all that. Results:
- first, C:*CC* still defaults to "gcc". No big deal (and I couldn't
actually find anything in the docs that implied that it would
magically switch to "g++"), and easily fixed anyway:
(let ((c:*cc* "g++"))
(compile-file #| ... |#))
All hail dynamic binding. :)
- second, I bound C:*CC* to "g++" as above, and recompiled, and it
generated this in my .h file:
#ifdef __cplusplus
extern "C" {
#endif
// ...
extern cl_object clos_ensure_class();
// ...
#ifdef __cplusplus
}
#endif
g++ still reports
too many arguments to function `cl_lispunion* clos_ensure_class()'
I pasted the g++ command sequence into my command line, and got the
same error (surprise). I added "-D__cplusplus" just to make sure, and
got the same error. I deleted the "#ifdef __cplusplus" stuff out of
the .h file, leaving the "extern "C" { ... }" stuff (just to make
*really* sure :), and got the same error.
I changed the .h file to say:
// ...
extern cl_object clos_ensure_class(
#ifdef __cplusplus
...
#endif
);
// ...
and that worked. I found where ecl emits the extern line, and patched
it:
--- 8< cut here ---
--- cmpcall.lsp.orig Thu Dec 11 12:17:01 2003
+++ cmpcall.lsp Tue Mar 2 23:48:50 2004
@@ -220,7 +220,11 @@
;; We only write declarations for functions which are not
;; in lisp_external.h
(when (and (not found) (not (si::mangle-name fname t)))
- (wt-h "extern cl_object " fd "();")
+ (wt-h "extern cl_object " fd "(
+#ifdef __cplusplus
+ ...
+#endif
+);")
(setf (gethash fd *compiler-declared-globals*) 1)))
(unwind-exit
(if (minusp maxarg)
--- >8 cut here ---
and that made it work automatically, at least for my tiny test case.
We'll see if it works for longer code, and other functions.
-- Larry
More information about the ecl-devel
mailing list