[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