I forgot to mention that the undefined references in the shared library only occur of the f90 module was compiled with the "-g" option to pgf90.
On Dec 27, 2009, at 2:28 PM, Aaron Knister wrote: > I don't think this is actually OpenMPI's problem. I know this is getting > slightly off topic but before I take this to the PGI folks I'd like to make > sure it isn't actually an OpenMPI problem after all. Here's my best shot at > explaining what I think is going on. Please excuse my rusty terminology. > > If one uses the PGI compilers to build a shared library based on an f90 > module the resulting object file and shared library contain references to any > subroutines defined inside any interfaces defined in said module. This can be > verified with nm. If you then link against the produced shared library the > compilation will fail with "undefined references" to any of the subroutines > that were contained inside any defined interfaces (that aren't defined within > the code being compiled). This doesn't seem to happen with the GNU or Intel > compilers. I have a small test case that I think reproduces the problem here. > Since I'm not by any means a fortran expert I was wondering if somebody on > the list who is a little more versed in fortran could verify that this code > is correct and should compile (it does with gnu and intel compilers). The > makefile can be found here http://pastebin.com/f7f320b97 and the source files > are below. > > mymod.f90: > module mymod > interface my_interface > subroutine my_subroutine > integer i > end subroutine my_subroutine > end interface > end module > > main.f90: > program main > print *, "hello world" > end program > > > On Dec 24, 2009, at 6:15 PM, Aaron Knister wrote: > >> I'm running into a strange problem with openmpi and the pgi compiler >> (version 9.0-4). I first stumbled across this when using petsc but have >> reduced it to a few lines of test code to demonstrate the problem I'm >> seeing. Essentially it appears as if a shared library contains a >> fortran-compiled object file that a) was built with "-g" and b) contains >> "use mpi" will produce errors similar to these when it is linked against: >> >> ./libfoo.so: undefined reference to `mpi_sizeof3dch_' >> ./libfoo.so: undefined reference to `mpi_sizeof4dl_' >> ./libfoo.so: undefined reference to `mpi_sizeof2dl_' >> ./libfoo.so: undefined reference to `mpi_sizeof2dch_' >> ./libfoo.so: undefined reference to `mpi_sizeof0dl_' >> ./libfoo.so: undefined reference to `mpi_sizeof1dch_' >> ./libfoo.so: undefined reference to `mpi_sizeof3dl_' >> ./libfoo.so: undefined reference to `mpi_sizeof1dl_' >> ./libfoo.so: undefined reference to `mpi_sizeof0dch_' >> ./libfoo.so: undefined reference to `mpi_sizeof4dch_' >> >> >> Take the following code- >> >> libfoo.f90: >> subroutine printhi() >> use mpi >> ! do some mpi stuff >> print *, "Hello" >> >> end >> >> main.f90: >> program myprog >> call printhi() >> end >> >> And to compile (using openmpi built with pgi): >> mpif90 -g -c -fPIC libfoo.f90 >> cc -shared -Wl -o libfoo.so libfoo.o >> mpif90 -g main.f90 -lfoo -L. -o main >> >> If I remove the "-g" from the first mpif90 command, then the compile >> finishes and there are no errors about undefined references. >> >> This occurs with openmpi-1.4 but ONLY with the pgi fortran compilers. I >> can't reproduce this behavior with either gnu gfortran or intel's ifort. >> >> I'm not sure if this is a pgi problem or an openmpi problem or if I'm >> missing something. >> >> Any help would be much appreciated! >> >> -Aaron >