Hi, I'm glad there's been some progress then. Don't hesitate to keep asking.
First off, you never told us why you need to split the build process in two with the "distributing c files" approach. It creates a lot of extra work, is less tested and has little documentation as you are experiencing right now. It is easier to either compile everything on the development machine and then distribute the binary files, or distribute the Chicken source files. What you're doing is in between: A Chicken compilation step on the development machine and then a C compilation step on the target machine. This generally isn't recommend. It would help if you'd provide a minimal sample of code that produces the errors you're seeing with all the commands that you tried. For example, based on your error message, I can only guess you have something like this: ➤ cat hello.scm (import format) (format #t "hello ~A" '(1 2)) The format egg depends on srfi-13, which in turn depends on srfi-14. As you can tell, the "distributing C files" approach doesn't scale well with number of dependencies since you have to do everything by hand. So I hope there is a way for you to build everything on the target machine, or build static binaries with csc -static - skipping the -t step altogether. I tried to look at how to get `format` compiled in as a .c-file, but unfortunately I wasn't able to do this from my Termux session. There is an --embed option in csc which could help with the "multiple definition of `main';" error messages, but I couldn't get it working with -t. Best of luck, K. On Sat, Aug 29, 2020, 08:26 亀田馬志 <[email protected]> wrote: > 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_3929040103320660110_m_1112985760836258250_m_1519709021909689587_m_8458393339131819835_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_3929040103320660110_m_1112985760836258250_m_1519709021909689587_m_8458393339131819835_m_-6073722823685365973_m_-3771291668364076337_m_2995656887587357561_m_-6378871799878235639_m_-3841790857946966358_m_692582290224770852_m_6593347720704535955_DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2> >>>>>>> >>>>>>
