Hello. > Kristian-san
I'm so sorry to thank you too late. Now I see how to use ctags and look for some particular c files defining something in Chicken Source files. It works; but I've faced the other problem and I do not know whether I should keep posting about it or not... For two weeks, I have been trying to solve the problem. The script I've written in Chicken Scheme reads an external data file, or text file written like this. $GPGGA,012345,1234.56789,N,12345.67890,E,1,08,0.00,0,M,,,,*1A $GPRMC,012345,A,1234.56789,N,12345.67890,E,000.0,123.4,,,,*1A $GPGGA,012346,1235.00000,N,12346.00000,E,1,08,0.00,0,M,,,, $GPRMC,012346,A,1235.00000,N,12346.00000,E,000.0,123.4,,,, $GPGGA,012347,1236.00000,N,12347.00000,E,1,08,0.00,0,M,,,, $GPRMC,012347,A,1236.00000,N,12347.00000,E,.000.0,123.4,,,, With the technique you showed me, the scheme script was compiled successfully with GCC; however, it gave me an error when I used it like this(poichan-01-1 is the name of compiled one): ➜ /tmp ./poichan-01-1 data.txt Error: (load) unable to load compiled module - cannot load compiled code dynamically - this is a statically linked executable: "/usr/local/lib/chicken/11/format.so" Call history: poichan-01-1.scm:1: chicken.load#load-extension <-- ➜ /tmp That means, in order to make this one a stand-alone, I have to put format.scm(which is shown in this: https://www.upyum.com/eggs-repo/egg-repositories.5.html ) in the directory, and compile it together. I tried that; however, ➜ poichan-01 gcc -DHAVE_CHICKEN_CONFIG_H poichan-01-1.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 format.c -lm -o poichan-01-1 /usr/bin/ld: /tmp/ccC5fVZw.o: in function `main': format.c:(.text+0x50772): multiple definition of `main'; /tmp/cc2oxINt.o:poichan-01-1.c:(.text+0x4610): first defined here /usr/bin/ld: /tmp/ccC5fVZw.o: in function `C_toplevel': format.c:(.text+0x5079f): multiple definition of `C_toplevel'; /tmp/cc2oxINt.o:poichan-01-1.c:(.text+0x463d): first defined here /usr/bin/ld: /tmp/ccC5fVZw.o: in function `f_1526': format.c:(.text+0x27ef): undefined reference to `C_port_toplevel' collect2: error: ld returned 1 exit status This time, C_port_toplevel....... O.K.! Now is the time what Kristian-san told me would work. I went back to the Chicken Source directory and used ctags to find the file defining C_port_toplevel. ➜ chicken-5.2.0 ctags *.c ➜ chicken-5.2.0 grep C_port_toplevel tags C_noret chicken-install.c /^C_externimport void C_ccall C_port_toplevel(C_word c,C_word *av) C_noret;$/;" v C_noret csi.c /^C_externimport void C_ccall C_port_toplevel(C_word c,C_word *av) C_noret;$/;" v C_noret posixunix.c /^C_externimport void C_ccall C_port_toplevel(C_word c,C_word *av) C_noret;$/;" v C_noret posixwin.c /^C_externimport void C_ccall C_port_toplevel(C_word c,C_word *av) C_noret;$/;" v C_noret stub.c /^C_externimport void C_ccall C_port_toplevel(C_word c,C_word *av) C_noret;$/;" v C_port_toplevel port.c /^void C_ccall C_port_toplevel(C_word c,C_word *av){$/;"f It seemed that "port.c" must have C_port_toplevel. I copied that in the directory I was working, and tried compiling the files again. ➜ poichan-01 gcc -DHAVE_CHICKEN_CONFIG_H poichan-01-1.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 format.c port.c -lm -o poichan-01-1 /usr/bin/ld: /tmp/cc0KJnH4.o: in function `main': format.c:(.text+0x50772): multiple definition of `main'; /tmp/ccs80BV2.o:poichan-01-1.c:(.text+0x4610): first defined here /usr/bin/ld: /tmp/cc0KJnH4.o: in function `C_toplevel': format.c:(.text+0x5079f): multiple definition of `C_toplevel'; /tmp/ccs80BV2.o:poichan-01-1.c:(.text+0x463d): first defined here collect2: error: ld returned 1 exit status AGAAAAAAIN! What the hens happened??? So, I've tried fixing this problem and taken time....... Well, there are some things I've noticed. 1. Don't use egg libraries if I want to compile my script into a C source. Stay in Chicken. 2. Arguments of the compiler become toooooo long. Now is the time to learn how to make Makefile. Well, this was a tough adventure. Thanks. 2020年8月15日(土) 18:42 Kristian Lein-Mathisen <[email protected]>: > > 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. > > On Sat, Aug 15, 2020, 02:57 亀田馬志 <[email protected]> wrote: > >> 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. >> >> >> 2020年8月13日(木) 14:56 Kristian Lein-Mathisen <[email protected]>: >> >>> >>> 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. >>> >>> On Thu, Aug 13, 2020, 03:27 亀田馬志 <[email protected]> wrote: >>> >>>> 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. >>>> >>>> >>>> >>>> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail> >>>> ウイルス >>>> フリー。 www.avast.com >>>> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail> >>>> <#m_-6073722823685365973_m_-3771291668364076337_m_2995656887587357561_m_-6378871799878235639_m_-3841790857946966358_DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2> >>>> >>>> 2020年8月13日(木) 6:39 Kristian Lein-Mathisen <[email protected]>: >>>> >>>>> >>>>> 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. >>>>> [1]: https://packages.ubuntu.com/focal/interpreters/chicken-bin >>>>> [2]: >>>>> http://wiki.call-cc.org/man/5/Deployment#distributing-compiled-c-files >>>>> >>>>> >>>>> On Mon, Aug 10, 2020, 21:28 亀田馬志 <[email protected]> wrote: >>>>> >>>>>> 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, >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail> >>>>>> ウイルス >>>>>> フリー。 www.avast.com >>>>>> <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail> >>>>>> <#m_-6073722823685365973_m_-3771291668364076337_m_2995656887587357561_m_-6378871799878235639_m_-3841790857946966358_m_692582290224770852_m_6593347720704535955_DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2> >>>>>> >>>>>
