[gambit-list] Difficulties linking against a C++ library

John Thompson bargarply at yahoo.com
Tue Feb 24 22:53:34 EST 2009


Figured it out due to this old message:

https://webmail.iro.umontreal.ca/pipermail/gambit-list/2004-October/000014.html

-John

--- On Tue, 2/24/09, John Thompson <bargarply at yahoo.com> wrote:
From: John Thompson <bargarply at yahoo.com>
Subject: Re: [gambit-list] Difficulties linking against a C++ library
To: "Marc Feeley" <feeley at iro.umontreal.ca>
Cc: gambit-list at iro.umontreal.ca
Date: Tuesday, February 24, 2009, 11:55 PM

Hi Marc,



Thanks for the response.  The include did indeed solve my compilation problems. 

Now I'm compiling like this:

gsc -link -flat foo.scm
g++ -Wno-write-strings -fPIC -c -D___DYNAMIC foo_.c foo.c
g++ -Wno-write-strings -fPIC -c -D___DYNAMIC foo.cpp -o cppfoo.o
ld -G -o foo.o1 cppfoo.o foo.o foo_.o

This leads to a run-time linking error of:

*** WARNING -- Could not find C function: "____20_foo_2e_o1"
*** ERROR IN ##main -- .../foo.o1: undefined symbol: ____20_foo_2e_o1
(load "foo.o1")

Any idea what the issue is here?

-John


--- On Tue, 2/24/09, Marc Feeley <feeley at iro.umontreal.ca> wrote:
From: Marc Feeley <feeley at iro.umontreal.ca>
Subject: Re: [gambit-list] Difficulties linking against a C++ library
To: bargarply at yahoo.com
Cc:
 gambit-list at iro.umontreal.ca
Date: Tuesday, February 24, 2009, 2:22 PM

On 24-Feb-09, at 8:41 AM, John Thompson wrote:

> Hi,
> 
> I'm trying to get a toy, loadable C++ library compiled.  My setup is
as follows:
> 
> foo.scm:
> 
>  (define bar (c-lambda (char-string) int "cpp_bar"))
> 
> foo.cpp:
> 
> int cpp_bar(char* text) {
>   return 0;
> }
> 
> foo.h:
> 
> int cpp_bar(char* text);

In C++, prototypes are not optional (and if it works in C it is by accident). 
In the C++ code generated for foo.scm the C++ compiler has no idea what is the
prototype of cpp_bar that you want to call.  You might think that the c-lambda
types are there to supply that information, but in fact the Gambit compiler
simply generates a call to cpp_bar whose *actual* parameters are those of the
c-lambda.  By not automatically generating
 a prototype for cpp_bar it allows for
cpp_bar to be a macro or a qualified name such as "cpp::bar" or inline
code such as "___result = ___arg1[0];".  So to solve your problem
foo.scm should be

(c-declare #<<end-of-c-declare
#include "foo.h"
end-of-c-declare
)

(define bar (c-lambda (char-string) int "cpp_bar"))

Note that you'd have to include foo.h if this was a C++ module, for exactly
the same reasons, so it shouldn't be too surprising.

Marc






      _______________________________________________
Gambit-list mailing list
Gambit-list at iro.umontreal.ca
https://webmail.iro.umontreal.ca/mailman/listinfo/gambit-list



      
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.iro.umontreal.ca/pipermail/gambit-list/attachments/20090224/c01ddbe6/attachment.htm>


More information about the Gambit-list mailing list