Fortran Compilation problem with gfortran

  • Thread starter Thread starter leroygr
  • Start date Start date
  • Tags Tags
    Gfortran
AI Thread Summary
The discussion revolves around compiling a Fortran 90 program that interfaces with C routines using gfortran on Ubuntu. The user is facing compilation errors related to the use of the `iargc` function, which is incorrectly treated as an external function. The solution involves modifying the code to correctly call `iargc()` as a function rather than an external variable. Additionally, the user encounters linking errors indicating undefined references to `iargc_` and `write_geogrid_`, suggesting that necessary libraries are not included in the makefile. The conversation highlights the need for proper function calls in Fortran and the inclusion of relevant libraries during the linking stage to resolve compilation issues.
leroygr
Messages
5
Reaction score
0
Hello everyone,

I'm trying since a few days to compile a f90 program with gfortran (on Ubuntu) with a makefile. The fortran program calls 2 routines written in C.

Here is my makefile:

Code:
FC              =       gfortran
SFC             =       gfortran
FFLAGS          =       -ffree-form -O -fconvert=big-endian -frecord-marker=4
F77FLAGS        =       -ffixed-form -O -fconvert=big-endian -frecord-marker=4
FNGFLAGS        =       $(FFLAGS)
LDFLAGS         =
CC              =       gcc
SCC             =       gcc
CFLAGS          =
CPP             =       /usr/bin/cpp -C -P -traditional
CPPFLAGS        =       -D_UNDERSCORE -DBYTESWAP -DLINUX -DIO_NETCDF -DBIT32 -DNO_SIGNAL
RANLIB          =       ranlib

all: rd_wr_formatted.exe

clean:
    rm -f *.o rd_wr_formatted.exe

rd_wr_formatted.exe: rd_wr_formatted.o read_geogrid.o write_geogrid.o
    $(FC) $(LDFLAGS) -o rd_wr_formatted.exe rd_wr_formatted.o read_geogrid.o write_geogrid.o

rd_wr_formatted.o: rd_wr_formatted.f90
    $(FC) -c $(FFLAGS) rd_wr_formatted.f90

read_geogrid.o: read_geogrid.c
    $(CC) -c $(CFLAGS) read_geogrid.c

write_geogrid.o: write_geogrid.c
    $(CC) -c $(CFLAGS) write_geogrid.c

Here is my fortran 90 program code:

Code:
program rd_wr_binary

   implicit none

   integer, external :: iargc

   integer :: istatus
   character (len=256) :: fname

   real, allocatable, dimension(:,:) :: rarray
!   real, allocatable, dimension(:,:) :: rarrayIN
   integer :: nx           ! x-dimension of the array
   integer :: ny           ! y-dimension of the array
   integer :: nz           ! z-dimension of the array
   integer :: isigned      ! 0=unsigned data, 1=signed data
   integer :: endian       ! 0=big endian, 1=little endian
   real :: scalefactor     ! value to divide array elements by before truncation to integers
   integer :: wordsize     ! number of bytes to use for each array element
 
   integer :: i
   integer :: j

   
!-----------------------------------------    
   if (iargc /= 1) then
     write(0,*) ' '
     write(0,*) 'Usage: rd_wr_binary.exe <filename>'
     write(0,*) ' '
     stop
   end if

   call getarg(1, fname)


   !
   ! The following must be set before compiling
   !
   nx = 1200
   ny = 1200
   nz = 1
   isigned = 0
   endian = 0
   wordsize = 4 
   scalefactor = 1.0

!   allocate(rarrayIN(nx,ny))
   allocate(rarray(nx,ny))


   !
   ! Read data from geogrid binary format using read_geogrid()
   !
!   call read_geogrid(fname, len_trim(fname), rarray, nx, ny, nz, isigned, endian, scalefactor, wordsize, istatus)
!   if (istatus /= 0) then
!      write(0,*) 'Error while reading '//trim(fname)//'. Quitting.'
!   end if
!

!
! We read formatted data instead of binary input file 
!   
    open(10, file=trim(fname), form='formatted', status='old')
   
    do j=1,ny
       read(10,33) (rarray(i,j),i=1,nx)
       write(*,*) i,j,rarray(nx,j)
    end do
 33    format(f6.1, 12000f7.1)    
! 33    format(18500f7.1) 

   close(10) 

! ------------ IF we need FLIP file -----
!      NO FLIP file!
!----------------------------------------
!        do j = 1,ny
!          do i = 1,nx
!            rarray(i,j) = rarrayIN(i,j)
!          enddo
!            write(*,*) i,j,rarray(nx,j)
!        enddo  
!--------------- end of FLIP/no FLIP ----  
   !
   ! Modify the field as necessary
   !

   !
   ! Write data to geogrid binary format using write_geogrid()
   !
   call write_geogrid(trim(fname)//'.bin', len_trim(trim(fname)//'.bin'), rarray, nx, ny, nz, isigned, endian, scalefactor, wordsize)

!   deallocate(rarrayIN) 
   deallocate(rarray)
   
   write(0,*) 'JOB finished OK!' 

end program rd_wr_binary

When I try to compile using "make" command, I get this error message that I don't understand:

Code:
[greg@Uranus:~/WRF/WPS/data/SRTM_to_geogrid]$ make
gfortran -c -ffree-form -O -fconvert=big-endian -frecord-marker=4 rd_wr_formatted.f90
rd_wr_formatted.f90:25.12:

   if (iargc /= 1) then
            1
Error: Function 'iargc' requires an argument list at (1)
rd_wr_formatted.f90:30.6:

   end if
      1
Error: Expecting END PROGRAM statement at (1)
rd_wr_formatted.f90:90.132:

fname)//'.bin'), rarray, nx, ny, nz, isigned, endian, scalefactor, wordsize
                                                                           1                                                         
Error: Syntax error in argument list at (1)
rd_wr_formatted.f90:90.132:

fname)//'.bin'), rarray, nx, ny, nz, isigned, endian, scalefactor, wordsize
                                                                           1                                                         
Warning: Line truncated at (1)
make: *** [rd_wr_formatted.o] Error 1

Can someone help me? I'm really really blocked...

Thank you very much!

Greg
 
Technology news on Phys.org
With the statement,

Code:
if (iargc /= 1) then

Are you trying to say "if iargc does not equal 1, then..."? If so, I would recommend using,

Code:
if (iargc .ne. 1) then

I'm not sure about the "Error: Expecting END PROGRAM statement", but it could have to do with the "stop" being there. See if ".ne." changes that. The last two errors you are getting are due to Fortran truncating programs at the 72nd column by default. If you type out something like,

Code:
!23456789012345678901234567890123456789012345678901234567890123456789012

Somewhere in your program, you can tell what line to do continuations at. Making those multiple line statements will fix those errors.

Hope that helped.

It doesn't look like anything is wrong with your makefile, just the code.
 
Yes indeed.

I did the modification you proposed but I got the same error...
 
The compiler thinks iargc is an external function and not an integer. After doing a web search, iargc is a function. You'll need to add code like this:

Code:
      integer argcount
      ...
      argcount = iargc()
      ...
      if(1 /= argcount)then
      ...

I don't know if this is allowed

Code:
      ...
      if(1 /= iargc() )then
      ...
 
Last edited:
Why is iargc defined as external?
 
I don't know exactly why... To be honest I'm not the author of the program. I try to use it for SRTM data to WRF geogrid binary data conversion. I understand what the program does generally, but unfortunately not all the code lines.

I'll try to add rcgldr's code.
 
I replaced

Code:
 if (iargc /= 1) then
     write(0,*) ' '
     write(0,*) 'Usage: rd_wr_binary.exe <filename>'
     write(0,*) ' '
    ! stop
   end if

by

Code:
 if (iargc() /= 1) then
     write(0,*) ' '
     write(0,*) 'Usage: rd_wr_binary.exe <filename>'
     write(0,*) ' '
    ! stop
   end if

It is better by I have the following errors now:

Code:
[greg@Uranus:~/WRF/WPS/data/SRTM_conversion]$ make
gfortran  -o rd_wr_formatted.exe rd_wr_formatted.o read_geogrid.o write_geogrid.o
rd_wr_formatted.o: In function `MAIN__':
rd_wr_formatted.f90:(.text+0x39): undefined reference to `iargc_'
rd_wr_formatted.f90:(.text+0x639): undefined reference to `write_geogrid_'
collect2: ld returned 1 exit status
make: *** [rd_wr_formatted.exe] Error 1

Any idea?
 
leroygr said:
Any idea?
You need to include library names in the make file for the link step. Apparently it's not defaulting to include the libraries you need to use iargc().
 
Ok! Can you explain to me how to do that? (I'm quite a newbie sorry ...)
 
  • #10
Back
Top