Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Fortran unidentified reference to 'gplot_'

For the past several days I haven't been able to get some Fortran code to compile (note that I am not the author of this code, I downloaded it from the author's web page. It's open source). The main program is called multitaper.f95, and it uses modules called plot and spectra, as well as libraries called mwlib.a and gplot.a. I have multitaper.f95, mwlib.a, gplot.a, plot.mod, and spectra.mod all in the same directory for simplicity. The plot and spectra moduels are made from gplot.f90 and mtspec.f95, respectively, which are also in the same directory as everything else. However, the following command produces an error message:

gfortran multitaper.f95 mtspec.f95 gplot.f90 -o multitaper -L gplot.a mwlib.a
/tmp/ccBJzwYI.o: In function `MAIN__':
multitaper.f95:(.text+0x1111): undefined reference to `gplot_'
multitaper.f95:(.text+0x11af): undefined reference to `gplot_'
multitaper.f95:(.text+0x1246): undefined reference to `gplot_'
collect2: error: ld returned 1 exit status

The contents of gplot.f90 are

module plot

!
!  Interface to allow for x or y to be a matrix, and plot each vector
!  of y against x. The matrix is given by horizontal vectors, y(:,1) is 
!  the first vector.
!   April 22 2005
!       Allowing to also use real(4) and real(8) units.
!

!
!  Interface
!           dvv vector vs vector
!       dvm vector vs matrix
!       dmm matrix vs matrix
!       rvv real(4) vector vs vector
!       rvm real(4) vector vs matrix
!       rmm real(4) matrix vs matrix
!

interface gnuplot
  module procedure gnuplot_dvv, gnuplot_dvm, gnuplot_dmm,              &
                   gnuplot_rvv, gnuplot_rvm, gnuplot_rmm,              &
                   gnuplot_rv,  gnuplot_rm      
end interface gnuplot

! The subroutines

contains

!The NEW GNUPlot subroutines

include 'gnuplot.f90'

end module plot

!======================================================================

Gnuplot.f90 has 3700 lines of code, so I won't post it in here. I'm new to Fortran, so I apologize in advance if I'm simply doing something stupid. But, I've been combing the internet for days looking for a solution, but I didn't turn up much. I found this (Fortran compilation error - undefined reference), but multitaper.f95 has a use statement for both spectra and plot, and gplot and the subroutines of gnuplot.f90 are not private. According to https://gcc.gnu.org/wiki/GFortranGettingStarted and http://www.oceanographers.net/forums/showthread.php?378-How-to-make-a-FORTRAN-library my terminal incantation should work, to the best of my knowledge. Just to be sure, I went ahead and tried compiling gplot.f90 and mtspec.f95 separately and giving the object files to the gfortran command instead, but this changed nothing. I also tried changing the file extension of gplot.f90 and gnuplot.f90 to f95, since there shouldn't be anything in there that would result in a version conflict, but once again this produced the same error message. I also tried including the full path to the directory after the -L command, just in case, and got the same error message.

The Makefile doesn't work any better, and I admittedly don't know much about them and how they work. When I run the make command, I get the following error as when I try to compile it manually. The contents of the Makefile are as follows:

# Location of files

DIR = /N/u/rccaton/Quarry/EarthHum/mtspec/program
LIB = /N/u/rccaton/Quarry/EarthHum/mtspec/program
#LIB2 = 

# Objects and Libraries

OBJS = $(LIB)/mwlib.a \
       $(LIB)/gplot.a \
#       /Applications/Absoft/lib/libU77.a


# Module locations

MODS = $(LIB)
MODS2 = $(LIB)

# Compiler
#FC =      g95
#FC =      f95
FC = gfortran

# Compiler flags
#   none
FLAGS =
#   debug
#FFLAGS = -g 

# Module flag

# Sun Compiler
#MFLAG = -M
# Nag Compiler
#MFLAG = -i
MFLAG = -I
# Absoft Compiler
#MFLAG = -p
# g95 compiler
#MFLAG = -I

MODULE = $(MFLAG)$(MODS) # $(MFLAG)$(MODS2) 

# Compile

all : multitaper

%:      %.f95 $(OBJS)
    $(FC) $(FFLAGS) $(MODULE) $< $(OBJS) -o $@


# Clean

clean : 
    rm multitaper

At the end of the day it makes to difference to me whether I end up compiling it with the makefile or with manual commands, I just need it to run. Sorry if this was verbose, I just want to provide as much relevant info as possible. Thank you for any assistance you can give.

like image 529
ThreeQuartersCrazed Avatar asked Jan 25 '26 09:01

ThreeQuartersCrazed


1 Answers

I would suggest to find which symbol is exported from gplot.a

nm gplot.a | grep -i "gplot"

and change compilers flags accordingly, search for gfortran flags:

-fno-underscoring
-fsecond-underscore
-fcase-*

In case it does not help, ask the author to give you correct MakeFile.

like image 139
Peter Avatar answered Jan 27 '26 23:01

Peter