[cffi-devel] C to Lisp
Stephan Frank
defclass at googlemail.com
Wed Nov 27 17:04:08 UTC 2013
your Hell-function has return value void so there is no return (apart
from that "return 0" that should not be there), hence the NIL. Printf
prints to stdout so maybe you just didn't see it?
On 27.11.2013 17:41, Greg Bennett wrote:
> Good morning,
> I (think I) might be close to getting a result in having a C function
> return its output to Lisp. I shall be very grateful for comments and
> corrections to what I have done, and thank readers for their patience.
>
> Here is the C-function from which I wish to get the result Hello Lisp
> from C on the lisp side:
> /* Hello.c program */
>
>
> #include<stdio.h>
>
> void Hello(void)
> {
> printf("Hello Lisp from C\n");
> return 0 ;
>
> }
>
> At the end of the process, I hope to be able to do this on the Lisp
> side:
> (defcfun ("Hello" HiFromC) (:void))
> and then
> (HiFromC) -> Hello Lisp from C
>
> Both C and Lisp sessions are below in case details are relevant.
> Somewhere I have missed a critical element.
>
> Thanks to a message from Luis Oliveira pointing me to the necessity of
> using a shared library as the intermediary between C and Lisp. There
> seem to be as many recipes for creating such libraries as there are
> posters of the topic, and as many variations on the code too. I have
> put together the C side following very much this page:
> www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html
>
> In file /home/gwbennett/Hello.h
> #ifndef Hello_h__
> #define Hello_h__
>
> extern void Hello(void);
>
> #endif // Hello_h__
>
> In file /home/gwbennett/Hello.c
> /* Hello program */
>
>
> #include<stdio.h>
>
> void Hello(void)
> {
> printf("Hello Lisp from C\n");
> return 0 ;
>
> }
>
> In file main.c
> /* This is main.c to go with Hello.c,h */
> #include <stdio.h>
> #include "Hello.h"
>
> int main (void)
> {
> Hello();
> return 0;
> }
>
> Then
> gcc -c -Wall -Werror -fpic Hello.c -> OK
> gcc -shared -o libfHello.so Hello.o -> OK
> gcc -L/home/gwbennett -Wall -o test main.c -lHello -> OK
>
> Step 4 of the above page is about making the library visible.
> I have tried all 3 routes with the same results; at the moment I have
> taken the path of installing libHello.so in /usr/lib (and
> in /usr/loca/lib too)as described in the Section Using ldconfig to
> modify ld.so
>
> gcc -Wall -o test main.c -lfoo -> OK
> ldd test | grep foo -> /usr/locl/lib/libHello.so (0x00007f946c0c4000)
> ./test -> Hello Lisp from C
>
> so things seem to work down the C-side
>
> On the Lisp side I (hope I) am following the cffi manual page 10. I
> assume that cffi looks for shared libraries in the same sort of 'system'
> places as C, but just in case, see page 106 on
> *foreign-library-directories*.
>
> Start ccl version 1.9-r15972M (LinuxX8664)
> (require :cffi) -> OK
> (defpackage :cffi-user
> (:use :common-lisp :cffi)) -> OK
> (in-package :cffi-user) -> OK
> ;P106
> (pushnew #P/"usr/lib" *foreign-library-directories* :test #'equal) -> OK
> (pushnew #P"/usr/local/lib" *foreign-library-directories* :test #'equal)
> -> OK
> (load-foreign-library '(:default "LibHello")) -> OK
> ;; I think I should be able to define the C -> Lisp name function
> (defcfun ("Hello" HiFromC) (:void)) -> HIFROMC
> ;; and execute it to get the message
> (HiFromC) -> NIL
>
> ;; .. so evidently I have not completely understood what is necessary to
> achieve the desired result.
>
> Again, thanks for any and all assistance.
> Cheers /Greg Bennett
>
>
>
>
>
More information about the cffi-devel
mailing list