views:

131

answers:

5

I am not a Fortran programmer (just a short experience), but I need to compile a program partly written in F77. Someone has compiled it with Absoft compiler before me, but now I need to repeat the procedure on another machine with g77. For Absoft, the makefile has

f77 -f  -w -O -B100 -B108 -c *.f
mv *.f flib && mv *.o olib
f77  -B100 -o runme olib/*.o clib/*.o -L/usr/X11R6/lib64 -L/usr/X11R6/lib -lX11 -L$PVM_ROOT/lib/$PVM_ARCH  -lfpvm3 -lpvm3 -L$ABSOFT/lib -lU77

I have modified these lines to be

g77   -w -O -B100 -B108 -c *.f
mv *.f flib && mv *.o olib
g77  -B100 -o runme olib/*.o clib/*.o -L/usr/X11R6/lib64 -L/usr/X11R6/lib -lX11 -L$PVM_ROOT/lib/$PVM_ARCH  -lfpvm3 -lpvm3  -lgfortran -lgfortranbegin

But I get the following error messages

somefile.f:(.text+0x93): undefined reference to `for_open'
somefile.f:(.text+0xf4): undefined reference to `for_write_seq_fmt'
somefile.f:(.text+0x128): undefined reference to `for_write_seq_fmt_xmit'
somefile.f:(.text+0x454): undefined reference to `for_read_seq'

How can I fix this?


UPDATE1

If I add -libifcore to the end of the last line (linker), then I get

/usr/bin/ld: cannot find -libifcore

I have located the library

$ find /opt/intel/* -name 'libifcore*'
/opt/intel/fce/9.1.036/lib/libifcore.a
/opt/intel/fce/9.1.036/lib/libifcore.so
/opt/intel/fce/9.1.036/lib/libifcore.so.5
/opt/intel/fce/9.1.036/lib/libifcore_pic.a
/opt/intel/fce/9.1.036/lib/libifcoremt.a
/opt/intel/fce/9.1.036/lib/libifcoremt.so
/opt/intel/fce/9.1.036/lib/libifcoremt.so.5
/opt/intel/fce/9.1.036/lib/libifcoremt_pic.a

But even if I do the following in the source directory

$ export PATH=$PATH:/opt/intel/fce/9.1.036/lib/
$ ln -s /opt/intel/fce/9.1.036/lib/libifcore.so

it is not found.

Moreover, it is the same machine where I get another problem http://stackoverflow.com/questions/3354818/how-to-pass-libm-to-mpicc-libimf-so-warning-feupdateenv-is-not-implemented

It seems that the compiler should find the library, if needed

$ echo $LD_LIBRARY_PATH
/opt/intel/fce/9.1.036/lib:/opt/intel/cce/9.1.042/lib:/usr/local/lib/openmpi:/usr/local/lib:/usr/lib:
+1  A: 

it looks like you are trying to link with libifcore.

Edit: You can include this library by adding '-lifcore' to your compiler options. To quote the gcc tutorial

In general, the compiler option -lNAME will attempt to link object files with a library file ‘libNAME.a’ in the standard library directories.

deinst
I have updated my question based on your answer-comment. Could you guide me further?
Andrey
you want -lifcore the syntax drops the ib, I'm pretty sure
deinst
Yes, he can add libifcore to his link as suggested above, but I doubt that this is the overall solution. If doesn't make sense that a Fortran program compiled and linked with g77 would link to an Intel Fortran library. Was one of the other libraries pre-compiled with ifort? That could be the reason that the link is looking for the Intel library. Then if you have the source code, it would be better to recompile with the same Fortran compiler. Or maybe g77 uses the same names for these routines and libifcore has nothing to do with it.
M. S. B.
The linker cannot find `-lifcore` also.
Andrey
then just put `/opt/intel/fce/9.1.036/lib/libifcore.a` or whatever the path is to your argument list instead of -lfcore or add an `-L/opt/intel/fce/9.1.036/lib` to your argument list
deinst
+1  A: 

Absoft accepted an extended version of Fortran 77 that is not completely compatible with the extended version of Fortran 77 accepted by g77.

So there is no guarantee that you can do this without editing the code. I seem to recall that the Absoft compiler accepted a handy initialization syntax that can not be replicated with g77.

dmckee
In the sources I see some notes about g77, and the code is distributed, so I make conclusion that it can be compiled with g77, if the compiling person knows what he/she is doing. My problem is that I do not know. I believe that the solution is a matter of linking proper libraries.
Andrey
@Andrei: Ah. That puts you one up on the last time *I* tried to do that... I'll leave the answer though i case someone comes looking who is in the less happy situation.
dmckee
+1  A: 

If you want to compile & link using g77, the easiest way is to use the command "g77". (What compiler does f77 invoke on your computer? Try "f77 -v" or similar to find out...) It should automatically find the g77 Fortran-specific libraries. You should not need to explicitly link to Fortran libraries, and especially not to the libraries of gfortran, which is a different compiler. You could also compile & link with gfortran -- it will probably recognize that the source code is Fortran 77 and compile appropriately if the files have the correct file type, otherwise you will have to use options -- for this compiler, use the command "gfortran".

With g77 and gfortran it should not need Intel libraries -- maybe f77 is connected to ifort, the Intel compiler, on your computer?

Edited later:

I suggest trying something simpler first to test your setup.

Try this FORTRAN 77 program as file "junk.f"

C234567
      write (6, *) "Hello World"
      stop
      end

Try this command:

g77 junk.f -o junk.exe

Run it via:

./junk.exe

This will test whether g77 is working.

M. S. B.
Sorry, that I haven't written it explicitly, `f77` command is linked to `g77`. I will update my question. I think something is strange with that Warewulf cluster if to consider my other question with similar error message by `ld`.
Andrey
I have just tried to use `ifort` - it also doesn't find `libifcore`. I guess something is wrong in library path variables etc.
Andrey
I can compile `junk.f` with both `g77` and `ifort`, and this program works in both cases.
Andrey
A: 

It seems that the problem was in an error in one of the source files, which wasn't a big deal for Absoft compiler. g77 was giving a warning about it, but compiling this file and producing the original errors (mentioned in the question) without a binary.

When I tried ifort, compilation of that file was aborted, but other files were compiled and a binary was created.

fortcom: Error: somefile.f, line 703: An extra comma appears in the format list.   [)]
     & (1p5e12.3,5h  ...,))                                             
-------------------------^
compilation aborted for somefile.f (code 1)

When I removed the extra comma, then both compilers have compiled everything and created binaries, although ifort produced a number of warnings.

Then, when I tried to run both binaries, the one made by Intel comiler was working fine, but the one by g77 was behaving very strange and didn't really do what I wanted.

So now the original problem is resolved, however the code doesn't run in multiprocessing mode, so the binary is unfortunately useless for me.

Andrey
+1  A: 

why do you use g77 and not gfortran? what do you mean with multiprocessing? openmp or vectorized?

you can use openmp with the gfortran compiler and when you want to use vector mode like the ifort compiler does, you have to specify sse explicitly in the compiler options.

f.jamitzky