unofficial mirror of guile-user@gnu.org 
 help / color / mirror / Atom feed
From: Hans Aberg <haberg-1@telia.com>
To: Mike Solomon <mikesol@ufl.edu>
Cc: guile-user@gnu.org
Subject: Re: Guile, C++, and Mac OS X 10.4 (powerpc)
Date: Wed, 28 Jul 2010 23:19:46 +0200	[thread overview]
Message-ID: <501CC8FC-0348-4E6D-87D7-67AD82CD45B1@telia.com> (raw)
In-Reply-To: <C8765677.1E9C3%mikesol@ufl.edu>

On 28 Jul 2010, at 21:49, Mike Solomon wrote:

> Hey guile users,
>    Trying to compile the simple example bessel.c from
> Writing-Guile-Extensions.html (renamed bessel.cc because I'm using g+ 
> +), I
> encountered the following error:
>
> bessel.cc: In function 'void init_bessel()':
> bessel.cc:13: error: invalid conversion from 'scm_unused_struct*
> (*)(scm_unused_struct*)' to 'scm_unused_struct* (*)(...)'
> bessel.cc:13: error:   initializing argument 5 of 'scm_unused_struct*
> scm_c_define_gsubr(const char*, int, int, int, scm_unused_struct* (*) 
> (...))'

The SCM type is a pointer to an undefined C type - C hack, which  
clashes with C++. Clever in C, but bad for C++ users.

> This even comes up when I put everything in extern "C" { ... }.  I  
> have seen
> other postings on the net for other software (lilypond, swig) that  
> speaks of
> the same issue, and some suggest that it is a problem with g++ and not
> guile.  I'm using powerpc-apple-darwin8-g++-4.0.1 (GCC) 4.0.1 (Apple
> Computer, Inc. build 5370)

When you use g++, all stuff is compiled as C++. So use gcc and add c++  
libraries when linking.

Then in formally correct C++, main() must be C++. Gcc accepts calling C 
++ from C, but attempting to pass an exception through a C function is  
converted to a termination exception.

So I wrote a C++ function scm::init_guile() calling scm_init_guile()  
and other stuff that needs to be initialized. Then
   int main(int argc, char** argv) {
     init_guile();

     try {
       ...
     }
     ...
   }

Then write a header bessel.h

#ifndef BESSEL_H
#define BESSEL_H

/* Copyright ...
    Free Software Foundation GNU General Public License <http://www.gnu.org/licenses/ 
 >
  */

#ifdef __cplusplus
extern "C" {
#endif

void init_bessel();
...

#ifdef __cplusplus
} // extern "C"
#endif

#endif BESSEL_H


The file bessel.c is compiled as C, but your C++ files include bessel.h.

   Hans






  reply	other threads:[~2010-07-28 21:19 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-07-28 19:49 Guile, C++, and Mac OS X 10.4 (powerpc) Mike Solomon
2010-07-28 21:19 ` Hans Aberg [this message]
2010-07-29  8:04   ` Mike Solomon
2010-07-29 12:43     ` Linas Vepstas
2010-08-18 13:49   ` Ludovic Courtès
2010-08-18 14:16     ` Hans Aberg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/guile/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=501CC8FC-0348-4E6D-87D7-67AD82CD45B1@telia.com \
    --to=haberg-1@telia.com \
    --cc=guile-user@gnu.org \
    --cc=mikesol@ufl.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).