[gambit-list] Calling Gambit Scheme functions from C

Marc Feeley feeley at iro.umontreal.ca
Mon Jul 12 17:37:34 EDT 2021


By default the link file (here somescheme_.c generated from somescheme.c) contains a C “main” function so that without any additional step the code can be compiled and linked (at the C level) to obtain an executable program. In other words the entry point of the program will be the Gambit runtime system.

However your file main.c also defines a C “main” function so you end up with a duplicate definition.  The way around this, shown below, is to compile the link file with the -D___LIBRARY C compiler option.  This will cause the somescheme_.c file to avoid the inclusion of a C “main” function (through a series of #ifdefs).  In other words, the Scheme code and the Gambit runtime system are acting as a library to the main C program.

Marc

gsc -c somescheme.scm
gsc -link somescheme.c
gsc -obj -cc-options -D___LIBRARY somescheme.c somescheme_.c          <========= need the -cc-options here
gsc -obj main.c
gcc somescheme.o somescheme_.o main.o -I$GAMBIT/include $GAMBIT/lib/libgambit.a -lm -ldl -lutil  -lssl -lcrypto




> On Jul 12, 2021, at 3:57 PM, Sonny To <son.c.to at gmail.com> wrote:
> 
> Hi,
> 
> Found an example of calling Scheme functions from C but cannot compile it
> https://gist.github.com/ncweinhold/991905
> 
> % gsc -c somescheme.scm
> % gsc -link somescheme.c
> % gsc -obj somescheme.c main.c somescheme_.c
> % gcc somescheme.o somescheme_.o main.o -I$GAMBIT/include
> $GAMBIT/lib/libgambit.a -lm -ldl -lutil  -lssl -lcrypto
> 
> ld: error: duplicate symbol: main
>>>> defined at somescheme_.c
>>>>           somescheme_.o:(main)
>>>> defined at main.c
>>>>           main.o:(.text+0x0)
> collect2: error: ld returned 1 exit status
> 
> How to prevent the main function generation in somescheme_.c  ?
> 
> Many thanks for any help.
> 
> -Sonny
> 
> _______________________________________________
> Gambit-list mailing list
> Gambit-list at iro.umontreal.ca
> https://mailman.iro.umontreal.ca/cgi-bin/mailman/listinfo/gambit-list
> 




More information about the Gambit-list mailing list