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

Dear Hans,
    Thank you very much for your response.  I'm including here some stuff I
did (a sort of c++ to c and back again) in hopes that it may be useful to
others trying to do the same thing.  Asterisk delimiters mean a new file,
whose name is in the first comment.

***
//bessel-extension.h

#ifndef BESSEL_EXTENSION_H
#define BESSEL_EXTENSION_H

#ifdef __cplusplus 
extern "C" {       
#endif       

int silly (int x);

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

#endif BESSEL_EXTENSION_H
***
//bessel-extension.cc

#include "bessel-extension.h"
#include "vector"

int
silly (int x)
{
  // include random c++ functionality
  std::vector<int> *foo = new std::vector<int>;
  foo->push_back (1);
  foo->push_back (2);
  int rv = foo->at (0) +foo->at (1)+x;
  delete foo;
  return rv;
}
***
// bessel.h

#ifndef BESSEL_H
#define BESSEL_H

#ifdef __cplusplus
extern "C" {
#endif


void init_bessel();

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

#endif BESSEL_H
***
// bessel.c
#include <math.h>
#include <libguile.h>
#include <bessel.h>
#include <bessel-extension.h>

SCM
j0_wrapper(SCM x)
{
return scm_make_real(j0 (scm_num2dbl(x,"j0")));
}

SCM
silly_wrapper(SCM x)
{
return scm_from_int(silly (scm_to_int (x)));
}

void
init_bessel()
{
scm_c_define_gsubr("j0",1,0,0,j0_wrapper);
scm_c_define_gsubr("silly",1,0,0,silly_wrapper);
}
***
// bessel.cc

#include "bessel-extension.h"
#include "bessel.h"

***

Then, compile:

g++ -c bessel-extension.cc
gcc -c -I. -fPIC bessel.c
g++ -bundle bessel-extension.o bessel.o -o libguile-bessel.so -lguile
bessel.cc

(this last line will change based on your platform...ie bundle becomes
shared for linux...use libtool if you're really serious about making
something durable!)

Then:

guile> (load-extension "./libguile-bessel" "init_bessel")
guile> (j0 2)
0.223890779141236
guile> (silly 6)
9

Hope this helps the fledgling C++ programmer using guile!

~Mike

On 7/28/10 11:19 PM, "Hans Aberg" <haberg-1@telia.com> wrote:

> 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-29  8:04 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
2010-07-29  8:04   ` Mike Solomon [this message]
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=C8770299.1E9ED%mikesol@ufl.edu \
    --to=mikesol@ufl.edu \
    --cc=guile-user@gnu.org \
    --cc=haberg-1@telia.com \
    /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).