Compilation problem with gfortran

  • Context: Fortran 
  • Thread starter Thread starter leroygr
  • Start date Start date
  • Tags Tags
    Gfortran
Click For Summary

Discussion Overview

The discussion revolves around a compilation issue encountered while trying to compile a Fortran 90 program that interfaces with C routines using gfortran on Ubuntu. Participants are exploring the errors generated during compilation and suggesting potential modifications to the code and makefile.

Discussion Character

  • Technical explanation
  • Debate/contested
  • Homework-related

Main Points Raised

  • Greg reports an error related to the use of the function iargc, suggesting that it may require an argument list, which leads to confusion about its definition.
  • One participant proposes changing the comparison operator from /= to .ne. to clarify the intent of the condition.
  • Another participant points out that iargc is a function and suggests modifying the code to assign its value to a variable before using it in the condition.
  • There is a discussion about why iargc is defined as external, with some participants expressing uncertainty about the original author's intentions.
  • After modifying the code to use iargc() instead of iargc, Greg encounters new errors related to undefined references, indicating potential issues with linking against necessary libraries.
  • One participant suggests that library names need to be included in the makefile for the linking step to resolve the undefined references.
  • Greg expresses a lack of familiarity with the necessary libraries and seeks further clarification on how to modify the makefile accordingly.

Areas of Agreement / Disagreement

Participants generally agree that the errors stem from the use of iargc and linking issues, but there is no consensus on the best approach to resolve the linking errors or the specifics of the required libraries.

Contextual Notes

Limitations include uncertainty about the original program's design and the specific libraries needed for successful compilation and linking.

Who May Find This Useful

This discussion may be useful for individuals working with Fortran and C interoperability, particularly those using gfortran on Linux systems and facing similar 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