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

Marc Feeley feeley at iro.umontreal.ca
Tue Feb 24 09:22:27 EST 2009


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




More information about the Gambit-list mailing list