[petsc-dev] Summary of attempts to get PETSc to work with mingw32-gfortran and MPI

John R. Cary cary at txcorp.com
Mon Nov 21 06:50:59 CST 2011


Brief summary

PETSc/mingw32-gfortran/HPCPACK (mpich2) fails because
mingw32-gfortran cannot link a simple MPI program.  There
seem also to be some problems with munging of the paths
when using "win32fe cl" for the C/C++ compiler.

PETSc/mingw32-gfortran/OpenMPI does not have the above
basic link problem, but it fails due to problems with
the PETSc build system.  When using CL (VS10), there are problems
in option translation (path munging).  When using mingw32-gcc/++, there seem
to be failures with the inclusion of some petsc generated
configuration files.

Longer report

Attempts to get PETSc-MPI-mingw-gfortran to work:

HPCPACK (mpich2):

Ultimately found a problem with the fortran library:

$ cat conftestf.f
       program main
        include 'mpif.h'
        integer ierr
        call mpi_init(ierr)
       end
$ mingw32-gfortran -o conftestf.o -c conftestf.f -I 
/winsame/contrib-mingw/microsoft-hpc-mingw/Include
xena.cary$ mingw32-gfortran -o conftestf.exe conftestf.o 
-L/winsame/contrib-mingw/microsoft-hpc-mingw/Lib/i386 -lmsmpifec -lmsmpi
Warning: .drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' 
unrecognized
/winsame/contrib-mingw/microsoft-hpc-mingw/Lib/i386/msmpifec.lib(obj/i386/mpif.obj):(.text[_mpi_recv_]+0x1f): 
undefined reference to `_imp__MPI_F_STATUS_IGNORE'
...

The missing symbol has a different name in the library,

$ link /dump /exports 
"C:\winsame\contrib-mingw\microsoft-hpc-mingw\Lib\i386\msmpi.lib" | grep 
F_STATUS_IGNORE
                   _MPI_F_STATUS_IGNORE

i.e., no _imp_ starting it.


OPENMPI (OpenMPI_v1.5.4-win32 binary package)

   --with-fc='mingw32-gfortran'

CL and OpenMPI: directories get munged, changes name of libgfortran.a

   --with-cc='win32fe cl' \
   --with-cxx='win32fe cl' \
   --with-mpi-include=/winsame/contrib-mingw/OpenMPI_v1.5.4-win32/include \
--with-mpi-lib="[/winsame/contrib-mingw/OpenMPI_v1.5.4-win32/lib/libmpi_f77d.lib,/winsame/contrib-mingw/OpenMPI_v1.5.4-win32/lib/libmpi.lib,/winsame/contrib-mingw/OpenMPI_v1.5.4-win32/lib/libopen-pal.lib,/winsame/contrib-mingw/OpenMPI_v1.5.4-win32/lib/libopen-rte.lib]" 
\

configureDynamicLibraries from 
PETSc.utilities.sharedLibraries(/winsameLINK : fatal error LNK1104: 
cannot open file 'libgfortran.lib'^M
ret = 512
                       Pushing language C
                       Popping language C
  in 
/winsame/builds-mingw/facetsall-mingw/petsc-3.1-p8/par/bin/win32fe/win32fe 
cl  -o conftest.exe    -MT -wd4996 -O2 -g  conftest.o   -lgfortran 
-L/winsame/builds-mingw/facetsall-mingw/petsc-3.1-p8/par/c:/mingw/lib/gcc/mingw32/4.6.1 
-L/winsame/builds-mingw/facetsall-mingw/petsc-3.1-p8/par/c:/mingw/lib/gcc -L/winsame/builds-mingw/facetsall-mingw/petsc-3.1-p8/par/c:/mingw/mingw32/lib 
-L/winsame/builds-mingw/facetsall-mingw/petsc-3.1-p8/par/c:/mingw/lib 
-L/mingw/lib -lgfortran -lmingw32 -lgcc_s -lmoldname -lmingwex -lmsvcrt 
-lquadmath -lm -ladvapi32 -lshell32 -luser32
Source:
#include "confdefs.h"
#include "conffix.h"

int main() {
;
   return 0;
}
           Popping language C
       compilers: Cannot compile/link C with 
/winsame/builds-mingw/facetsall-mingw/petsc-3.1-p8/par/bin/win32fe/win32fe 
cl.


libgfortran.lib does not exist, but libgfortran.a does.


mingw32-gcc and OpenMPI:

   --with-cc='mingw32-gcc' \
   --with-cxx='mingw32-g++' \

Directories not munged, but there is something wrong, it seems,
with the includes of PETSc's build system.

sh: mingw32-g++ -c -o conftest.o  -Wall -Wwrite-strings 
-Wno-strict-aliasing -O    
-I/winsame/contrib-mingw/OpenMPI_v1.5.4-win32/include conftest.cc
Executing: mingw32-g++ -c -o conftest.o  -Wall -Wwrite-strings 
-Wno-strict-aliasing -O    
-I/winsame/contrib-mingw/OpenMPI_v1.5.4-win32/include conftest.cc
sh:
Possible ERROR while running compiler: ret = 256
error message = {In file included from conftest.cc:3:0:^M
/winsame/contrib-mingw/OpenMPI_v1.5.4-win32/include/mpi.h:1082:25: 
error: expected ')' before 'comm'^M
/winsame/contrib-mingw/OpenMPI_v1.5.4-win32/include/mpi.h:1096:25: 
error: expected unqualified-id before 'int'^M
/winsame/contrib-mingw/OpenMPI_v1.5.4-win32/include/mpi.h:1096:25: 
error: expected ')' before 'int'^M
}
Source:
#include "confdefs.h"
#include "conffix.h"
#include <mpi.h>

int main() {
;
   return 0;
}

Line 1082 is

OMPI_DECLSPEC  MPI_Fint MPI_Comm_c2f(MPI_Comm comm);

Line 1096 is

OMPI_DECLSPEC  MPI_Comm MPI_Comm_f2c(MPI_Fint comm);

I can compile the above source without the extra conf includes:

$ cat conftestc.c                                                      
#include <mpi.h>

int main() {
;
   return 0;
}
$ mingw32-g++.exe -c -o conftestc.o -O    
-I/winsame/contrib-mingw/OpenMPI_v1.5.4-win32/include conftestc.c
$

BTW, Link with mingw32-g++ fails:

$ mingw32-g++ -o conftestc.exe conftestc.o  
-L/winsame/contrib-mingw/OpenMPI_v1.5.4-win32/lib -llibmpi_cxx -llibmpi 
-llibopen-pal -llibopen-rte        
conftestc.o:conftestc.c:(.text$_ZN3MPI2Op4InitEPFvPKvPviRKNS_8DatatypeEEb[MPI::Op::Init(void 
(*)(void const*, void*, int, MPI::Datatype const&), bool)]+0x1b): 
undefined reference to `ompi_mpi_cxx_op_intercept'
conftestc.o:conftestc.c:(.text$_ZNK3MPI9Intracomm11Create_cartEiPKiPKbb[MPI::Intracomm::Create_cart(int, 
int const*, bool const*, bool) const]+0x81): undefined reference to 
`MPI::Comm::Comm()'
...






More information about the petsc-dev mailing list