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>
>>>>>>
>>>>>

Reply via email to