> 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]]