Skip to content

F77_CALL/NAME problem

5 messages · bstr, John McKown, William Dunlap

#
Dear R-devel,

I am trying to use Fortran DGESV subroutine into C. Here it is the relevant
part of the C file I am currently writing

#include<stdio.h>
#include<R.h>
#include<Rmath.h>
#include<math.h>

void F77_NAME(DGESV)( int*, int*, double*, int*, int*, double*, int*, int*);

void solve( int *p, double *A, double *Ainv)
{
        ...
	F77_CALL(DGESV)(p, p, Ain, p, ipiv, Bin, p, &info);
}

In order to create the ".so" file to load in R I downloaded the dgesv.f file
as well as the dependencies (dgetf2.f dgetrf.f dgetrs.f dlaswp.f). As I was
used to I ran in a terminal

R CMD COMPILE *.f
R CMD SHLIB MY_C_FILE.c *.o

to get the MY_C_FILE.so file. However, when I try to load it in a R session
I get the following error message "undefined symbol: DGESV_". Similar errors
are occurring with some other (old) C files that I was used to use a couple
of years ago. In this connection I have to say that those file were working
under an older linux version (I guess ubuntu 12.04 LTS rather than the
current one which is 14.04 LTS).

Best Regards,

N. Lunardon



--
View this message in context: http://r.789695.n4.nabble.com/F77-CALL-NAME-problem-tp4705076.html
Sent from the R devel mailing list archive at Nabble.com.
#
I was not able to find why my old way to do things did not work. However, I
"discovered" that dgesv is also in the header Lapack.h. So I just dropped
form the C code the declarations F77_NAME/CALL and used directly function
dgesv_ as declared in Lapack.h. Of course I had to compile with the -llapack
flag.



--
View this message in context: http://r.789695.n4.nabble.com/F77-CALL-NAME-problem-tp4705076p4705096.html
Sent from the R devel mailing list archive at Nabble.com.
#
On Wed, Mar 25, 2015 at 4:44 AM, bstr <nicola.lunardon at hotmail.it> wrote:
Try lower case.

void F77_NAME(dgesv)( int*, int*, double*, int*, int*, double*, int*, int*);

 void solve( int *p, double *A, double *Ainv)
 {
         ...
         F77_CALL(dgesv)(p, p, Ain, p, ipiv, Bin, p, &info);
 }

The lapack.so file has a name "dgesv_" in it, not DGESV_.

  
    
#
You said you changed F77_NAME(DGESV) to dgesv_ to make it
work and inferred that F77_NAME was the the problem.

I suspect that things got better because you changed the capitalization
and that F77_NAME(dgesv) would have worked as well.

Adding
   #include <R_ext/Lapack.h>
to your code would declare these things as well (and declare them
properly, with the 'const' declarations in the appropriate places).



Bill Dunlap
TIBCO Software
wdunlap tibco.com
On Wed, Mar 25, 2015 at 9:36 AM, bstr <nicola.lunardon at hotmail.it> wrote:

            

  
  
#
Thank you John and William for the replies!

@John: I downloaded the Fortran files from 
http://www.netlib.org/lapack/double/ <http://www.netlib.org/lapack/double/>  
(the link "dgesv.f plus dependencies"). In file dgesv.f the subroutine is
declared as 

SUBROUTINE DGESV( N, NRHS, A, LDA, IPIV, B, LDB, INFO ) 

with capital letters.

@William: after looking for a while for a solution I discovered that R had
"embedded" all the things I needed, so I just got rid of F77_NAME/CALL in my
C code and simply called dgesv_ as declared in Lapack.h (adding as you
suggested #include <R_ext/Lapack.h> in the preamble). So I did not changed
the previous declarations of DGESV in my C file to lower case.

On the one hand, it seemed (and seems) to me quite odd that my old code did
not work and I would like to know why, even if it not a priority anymore. On
the other hand, I am happy to have found a new, and, I suppose, more
"R-package" oriented way, to use Fortran's linear algebra routines in my C
code. 

N. Lunardon



--
View this message in context: http://r.789695.n4.nabble.com/F77-CALL-NAME-problem-tp4705076p4705128.html
Sent from the R devel mailing list archive at Nabble.com.