FW: How do I link a C function with a gFortran program

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I am trying to invoke a C function from a gFortran program.

The C function is called Read_Block and is intended to read one block from a
binary file that was not created by Fortran so does not have the fortran
header and footer on each block.

Both program and function compile, but when I try to link, I get the
message,  "undefined reference to 'read_block_'."

If I use the compile switch -fno-underscoring I similarly get  "undefined
reference to 'read_block'."

I assume this is a name mangling problem, and I need a switch to tell
gFortran to use C type name mangling.
# Is there a solution?
# If it is not yet available in gFortran, is it available in g77?

Thank you if you can point me to any help.

Doug Sherman
_____________________

Below are my test program, function and makefile.
I am running Windows XP and invoking the makefile from a command window.

READ_DAC.F90
============

program main

      interface
        integer function Read_Block(fnp, fp, fb)
          implicit none
          character*60, pointer  :: fnp       ! file name pointer
          integer, pointer       :: fp        ! FILE pointer
          character*512, pointer :: fb        ! block pointer
        end function Read_Block
      end interface

      character*60, target   :: filename
      character*60, pointer  :: fnp
      integer, pointer       :: fp        ! FILE pointer
      character*512, target  :: block
      character*512, pointer :: fb        ! block pointer
      fnp => filename
      fp  =  0
      fb  => block
      filename =  'OLM_ZH878_255_3_C_V_201.dac' // char(0)
      numread =  Read_Block (fnp, fp, fb)
      if(numread .ne. 512)print *, "numread = ", numread, " != 512 !!"
      end program main

READ_BLOCK.C
============

/*  Read_Block (fn*, fp*, bp*)  Read one block from a .DAC file
 *    fn is a pointer to a filename
 *    fp is a pointer to the file. 
 *    bp is a pointer to a block of 512 bytes
 *  fp must be 0 at first call to function for each new file name.
 *  In subsequent calls, the value of fp must be the same as that returned
 *  at the first call for the given file name.
 *  I'VE JUST REALISED THAT FP WILL -NOT- BE RETURNED THIS WAY.
 *  (I'M TOO USED TO FORTRAN SUBROUTINES RATHER THAN C!)
 *  BUT I CAN FIX THAT PROBLEM.  THE MAIN PROBLEM ABOUT LINKING STILL
REMAINS.
 *  Read_Block returns number of bytes read (should be 512, otherwise error,
probably EOF).
 *  Exits with errorflag of 1 if unable to open file.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
long  Read_Block (char*, FILE*, char*);

long  Read_Block (char* fnp, FILE* fp, char* bp) {  if ( fp==0 )
   {  if   ( (fp = fopen(fnp, "rb")) == NULL )
        {fprintf(stderr, "Error opening file: %s\n", fnp);
         exit(1);
        }
   }
   int numread = fread(bp, sizeof(char), 512, fp);
   return numread;
}

 
MAKEFILE
========

objs  = Read_DAC.o  Read_Block.o

Read_DAC.exe : $(objs)
      gfortran -o Read_DAC.exe  $(objs)

Read_DAC.o   : Read_DAC.f90
      gfortran -c -fbounds-check -fno-backslash -funderscoring Read_DAC.f90
>Read_DAC.err   2>&1

Read_Block.o : Read_Block.c
      gcc      -c -fbounds-check  -Wall         Read_Block.c
>Read_Block.err 2>&1


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux