appears using CHICKEN 5 but extras.c & data-structures.c are CHICKEN 4 modules
Hi,
I'm glad that helped. But I suppose I should have explained my process, instead of just giving you the end result - which clearly doesn't work once you start adding imports like you have.
The error messages you're seeing (undefined reference to `C_extras_toplevel') are coming from your C compilier. They mean that your program is using a function which isn't defined anywhere, so we need to find where C_extras_toplevel is defined.
There are probably a hundred different ways of finding the .c file which defines a function. Here's and one. Install ctags and then run this:
~/o/chicken-5.2.0rc1 ➤ ctags *.c # creates a "grepable" file called tags
~/o/chicken-5.2.0rc1 ➤ grep C_extras_toplevel tags C_extras_toplevel extras.c /^void C_ccall C_extras_toplevel(C_word c,C_word *av){$/;" f typeref:typename:void C_ccall # so it seems we need extras.c too
~/o/chicken-5.2.0rc1 ➤ grep C_data_2dstructures_toplevel tags C_data_2dstructures_toplevel data-structures.c /^void C_ccall C_data_2dstructures_toplevel(C_word c,C_word *av){$/;" f typeref:typename:void C_ccall # and data-structures.c
~/o/chicken-5.2.0rc1 ➤ gcc -DHAVE_CHICKEN_CONFIG_H hello.c -I . runtime.c library.c eval.c expand.c modules.c internal.c chicken-syntax.c build-version.c extras.c data-structures.c -lm -llog -o hello
Adding those two files to the gcc command should get your program to compile properly. If not, you can find the missing .c files by grepping `tags`.
Hope that helps. K. Hello.
>
gcc -DHAVE_CHICKEN_CONFIG_H hello.c -I . runtime.c library.c eval.c expand.c modules.c internal.c chicken-syntax.c build-version.c -lm -o hello
Oh, yes. It works! Great! Thank you!
But......
I wrote a script like this.
(import format (chicken io) (chicken string) (chicken process-context))
(require-extension srfi-13)
(let ((file-name (car (command-line-arguments)))) (with-input-from-file file-name (lambda () (let loop ((ls0 '()) (c (read-line))) (if (eof-object? c) (for-each (lambda (x) (format #t "時刻:~A秒,北緯:~A度~A分,東経:~A度~A分~%" (+ (* (cadar x) 60) (caddar x)) (string-take (cadr x) 2) (string-drop (cadr x) 2) (string-take (caddr x) 3) (string-drop (caddr x) 3))) (reverse ls0)) (let ((ls1 (string-split c ","))) (if (string=? (car ls1) "$GPGGA") (loop (cons `(,(map string->number (string-chop (list-ref ls1 1) 2)) ,(list-ref ls1 2) ,(list-ref ls1 4)) ls0) (read-line)) (loop ls0 (read-line)))))))))
Sorry, some Japanese are mixed. But. Anyway. I try compiling with your way, and gcc gives me an error like this.
/usr/bin/ld: /tmp/ccxVWfZy.o: in function `f_223': poichan-01-1.c:(.text+0x765): undefined reference to `C_extras_toplevel' /usr/bin/ld: /tmp/ccxVWfZy.o: in function `f_226': poichan-01-1.c:(.text+0x92d): undefined reference to `C_data_2dstructures_toplevel' collect2: error: ld returned 1 exit status
Hmmmm.... Is there something wrong on the code? What are the C_extras_toplevel and C_data_wdstructures_toplevel?
If I used some libraries from chicken-install, should I use the compiled "scheme to c" file too?
There must be something more to learn around the Chicken Scheme more.....
Anyway, you have helped me a lot! Thank you.
Hi,
I managed to get something working on my termux, maybe that can help you:
~/o/chicken-5.2.0rc1 ➤ echo '(print "hello")' > hello.scm ~/o/chicken-5.2.0rc1 ➤ ./csc -t hello.scm ~/o/chicken-5.2.0rc1 ➤ gcc -DHAVE_CHICKEN_CONFIG_H hello.c -I . runtime.c library.c eval.c expand.c modules.c internal.c chicken-syntax.c build-version.c -lm -llog -o hello ~/o/chicken-5.2.0rc1 ➤ ldd hello libm.so liblog.so libdl.so libc.so ~/o/chicken-5.2.0rc1 ➤ ./hello hello
You can ignore -llog unless you're on Android.
So you don't need buildtag.h. Is there a reason you can't "csc -static hello.scm" or "csc -static -C -static hello.scm" which is a more common use-case?
Cheers, K. Thanks for your reply.
> It seems there is a chicken-bin for U20.04LTS
Yes, there is BINARY. I mean I could not find a SOURCE CODE package. (Usually, you can take source code from the Ubuntu repository if you wished to.)
> did you try compiling hello.scm to hello.c with that?
Yes, I did. To write a single file with Scheme codes, and to compile to a SINGLE c file, it is a piece of cake.
> Are you reading the manual for Chicken 5
Yes, of course. I followed the instructions on it. You may see there:
"Compiled to C, we get hello.c. We need the files chicken.h, chicken-config.h, buildtag.h and runtime.c, which contain the basic runtime system, plus the library files build-version.c, chicken-syntax.c, eval.c, expand.c, internal.c, library.c and modules.c, which contain the same functionality as the library that is linked into plain CHICKEN-compiled applications:"
However, as you may notice, there is no buildtag.h generated even though you built Chicken Scheme from its source code. Therefore, you can not proceed to the rest process using /tmp described next.
> perhaps the manual is outdated?
OMBuddha. If what you are saying were right....what should I do!?
Thanks.
Hi,
It seems there is a chicken-bin for U20.04LTS [1], did you try compiling hello.scm to hello.c with that? What is it that you're trying to acheive?
I don't seem to have any buildtag.h either, perhaps the manual is outdated?
Are you reading the manual for Chicken 5 [2]?
K.
Hello.
I tried following and obeying the instructions described in Deployment, the manual of Chicken Scheme, in order to cock-a-do-do "Distributing compiled C files", but it did not work well.
1. Ubuntu Repository provides no source code of Chicken Scheme
I'm using Ubuntu 20.04 LTS, currently an OS under the feather, and I could not find the source code of Chicken Scheme in its repository. Neither in Debian? I do not know. Hen_ce, I had to build Chicken Scheme from its source code.
2. Where the chick can I find buildtag.h?
I switched to using Windows 10, and made an environment of Ubuntu with WSL(Windows Subsystem for Linux). There I built a Chicken Scheme from its source, and followed the instructions. BUT. I could not find buildtag.h there even though the manual says "generated by the build process". Did I miss something? Is there any special way to get buildtag.h?
3. Anyway tried compiling "Hello World", but getting a bunch of error messages.
I did not know whether compiling with gcc worked well or not without buildtag.h, but I tried. The result was a bunch of errors, something like this:
"/usr/bin/ld: /tmp/ccJKB9L5.o: in function `C_modules_toplevel': modules.c:(.text+0xad58): undefined reference to `C_chicken_2dsyntax_toplevel' collect2: error: ld returned 1 exit status"
Something related to toplevel stuff did not work well. As egg-spected? Maybe, yes.
Well, is there any technique of "Distributing compiled C files" outside of the manual, or is there anything I did wrong(especially in the building process)?
Thanks,
|