> From: r-help-bounces@r-project.org
<http://tolstoy.newcastle.edu.au/R/e6/help/09/03/8794.html#16298qlink1>
*> [mailto:r-help-bounces_at_r-project.org] On Behalf Of Thomas Lumley *
*> Sent: Monday, June 01, 2009 9:33 AM *
*> To: cls59 *
*> Cc: r-help_at_r-project.org *
*> Subject: Re: [R] Calling Fortran from C++ *
*> *
*> On Mon, 1 Jun 2009, cls59 wrote: *
*> *
*> > *
*> > *
*> > Giura Gauss wrote: *
*> >> *
*> >> Hi, *
*> >> *
*> >> can anybody point me to a package with C++ code that call Fortran *
*> >> subroutines? *
*> >> *
*> >> I am trying to do the same thing but we scarce success. *
*> >> *
*> >> Error in dyn.load("utils.so") : *
*> >> unable to load shared library 'utils.so': *
*> >> dlopen(utils.so, 6): Symbol not found: _robcovf *
*> >> Referenced from: utils.so *
*> >> Expected in: dynamic lookup *
*> >> *
*> >> *
*> >> *
*> > *
*> > It seems like you have a problem with function names which *
*> is a common *
*> > obstacle when interfacing C and Fortran. What usually *
*> happens is that a *
*> > trailing underscore gets added to fortran function names *
*> when they are *
*> > compiled. For example, consider a fortran subroutine declared as: *
*> > *
*> > subroutine gaussQuad ( a, b, f1, f2 ) *
*> > *
*> > Since an underscore usually gets added and Fortran passes *
*> variables by *
*> > reference, the above subroutine would be seen by C as: *
*> > *
*> > void gaussQuad_( a&, b&, f1&, f2& ); *
*> > *
*> *
*> Because this varies from compiler to compiler, R provides *
*> macros that do the correct name mangling, so it would be *
*> void F77_CALL(*a, *b, *f1, *f2) *
*> in C (not a&, b&, etc, which are C++ syntax). *
*> *
*> -thomas *
*> *
*> Thomas Lumley Assoc. Professor, Biostatistics *
*> tlumley_at_u.washington.edu University of Washington, Seattle


Thank you all. I should have known about F77_CALL. I think I used once.

However, I have still problems.

robcovf.f constains a fortran subroutine: subroutine robcovf(n, p, nc,
start, len, u, s, v, w)

My C++ file (utils.cc):

extern "C"{
  void robcovf_(const int *n, const int *p, const int *nc,
        const int *start, const int *len,
        double *u, double *s, double *v, double *w);

  void wb(const double* Xdata, const double* Ydata,
        const int* nrow, const int* ncol, const int* nrep,
        const int* clusstart, const int* clussize, const int* nc,
        double* out1, double* out2)
  {

[...]

F77_CALL(robcovf)(nrow, ncol, nc, clusstart, clussize, u, s, v, w);

[other stuff...]
}


I do:

R CMD SHLIB robcovf.f

**R CMD SHLIB utils.cc

They compile just fine, but

> dyn.load('utils.so')
Error in dyn.load("utils.so") :
  unable to load shared library 'utils.so':
  dlopen(utils.so, 6): Symbol not found: _robcovf_
  Referenced from: utils.so
  Expected in: dynamic lookup


Now, I have two underscores!!






*
*















*

	[[alternative HTML version deleted]]


