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@iro.umontreal.ca> wrote:
From: Marc Feeley <feeley@iro.umontreal.ca>
Subject: Re: [gambit-list] Difficulties linking against a C++ library
To: bargarply@yahoo.com
Cc: gambit-list@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