[Ecls-list] How to compile and link lisp and c files?
Dietrich Bollmann
dietrich at formgames.org
Tue May 28 17:42:47 UTC 2013
Hi,
I have the following lisp file:
---
$ cat hello-lisp.lisp
(defun hello-lisp () (format t "hello-lisp!~%"))
---
and would like to call the function (hello-lisp) from the following c file:
---
$ cat hello.c
#include <stdio.h>
#include <ecl/ecl.h>
int main (int argc, char **argv) {
cl_boot(argc, argv);
// evaluating (hello-lisp)
cl_eval(c_string_to_object("(hello-lisp)"));
cl_shutdown();
return 0;
}
---
On my Mac I compiled and linked the files as follows:
---
ecl -eval '(compile-file "hello-lisp.lisp" :system-p t)' -eval '(quit)'
gcc -Wall -c `ecl-config --cflags` -c hello.c
gcc -Wall -o hello `ecl-config --libs` hello-lisp.o hello.o
---
But when executing the file 'hello' I get the following error:
---
./hello
Condition of type: UNDEFINED-FUNCTION
The function HELLO-LISP is undefined.
No restarts available.
Top level in: #<process TOP-LEVEL>.
>
---
I tried to solve this problem by including the hello-lisp.eclh file which
is generated when using (compile-file "hello-lisp.lisp" :h-file t) but this
didn't solve the problem either. I am not yet able to understand the
generated c code and therefore don't understand how to use it correctly.
How can I make this simple example work?
Thanks,
Dietrich
I am currently working on a Mac but ultimately have to make the example
work with MS VC++. This is why I prefer to call the c compiler and linker
myself rather than using ECLs lisp based build tools like c::build-program,
etc.
For the same reason I would also prefer to separate the translation of lisp
files into c and object files. But I couldn't find a way to compile a lisp
file to c without producing an object or fasl file in the same time as it
is done when using (compile-file ...). I tried ':o-file nil' but even if
this parameter is mentioned in the help text of (compile-file ...) it seems
to not have been implemented yet. I would be grateful about help
concerning this point as well.
So the ideal procedure would be something like this
- translate lisp files to c files
- compile c files to object files
- link the object files
as this would be easier to integrate with MS VC++.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/ecl-devel/attachments/20130529/42a08eac/attachment.html>
More information about the ecl-devel
mailing list