Проблема компиляции MPICH2 с использованием Cygwin

Попытка скомпилировать MPICH2 на компьютере с Windows, используя Cygwin.

Немного актуальной информации

  • $ uname -> CYGWIN_NT-6.1
  • $ gcc --version -> gcc (GCC) 3.4.4 (специальный cygming, gdc 0.12, используя dmd 0.125) Copyright (C) 2004 Free Software Foundation, Inc. Это свободное программное обеспечение; см. источник для условий копирования. Там нет гарантии; даже не для ТОВАРНОЙ ДЕЯТЕЛЬНОСТИ или ПРИГОДНОСТИ ДЛЯ ОСОБЫХ ЦЕЛЕЙ.
  • Версия MPICH2: 1.5

Конфигурация, кажется, завершена надлежащим образом, но во время компиляции я получил следующее:

**** Making src/misc ....
make --no-print-directory  build_lib_bin
make --no-print-directory  mpe_debug_objs
make --no-print-directory  /home/Daeden/issm/trunk-jpl/externalpackages/mpich2/src/src/mpe2/lib/libmpe_nompi.a
make[7]: `/home/Daeden/issm/trunk-jpl/externalpackages/mpich2/src/src/mpe2/lib/libmpe_nompi.a' is up to date.
make --no-print-directory  /home/Daeden/issm/trunk-jpl/externalpackages/mpich2/src/src/mpe2/lib/libmpe.a
gcc  -I/home/Daeden/issm/trunk-jpl/externalpackages/mpich2/src/src/include -I/home/Daeden/issm/trunk-jpl/externalpackages/mpich2/src/   src/include -I.. -I../include  -I../../.. -I../../../include   -o dbxerr.po -c dbxerr.c
dbxerr.c: In function `MPE_DefaultHandler':
dbxerr.c:429: error: parse error before '{' token
dbxerr.c:432: error: argument "sig" doesn't match prototype
dbxerr.c:407: error: prototype declaration
dbxerr.c:461: warning: passing arg 2 of `signal' from incompatible pointer type
dbxerr.c:463: warning: passing arg 2 of `signal' from incompatible pointer type
dbxerr.c:465: warning: passing arg 2 of `signal' from incompatible pointer type
dbxerr.c:467: warning: passing arg 2 of `signal' from incompatible pointer type
dbxerr.c:469: warning: passing arg 2 of `signal' from incompatible pointer type
dbxerr.c:473: warning: passing arg 2 of `signal' from incompatible pointer type
Makefile:82: recipe for target `dbxerr.po' failed
make[7]: *** [dbxerr.po] Error 1
Makefile:111: recipe for target `default' failed
make[6]: *** [default] Error 2
Makefile:43: recipe for target `build_lib_bin' failed
make[5]: *** [build_lib_bin] Error 2
Makefile:26: recipe for target `all' failed                                                                                                                make[4]: *** [all] Error 2

Проверяя 'dbxerr.c', я нахожу это:

#if defined(HAVE_SIGHANDLER_T)
#define SIG_HANDLER_PROTOTYPE sighandler_t
void MPE_DefaultHandler ( SIG_HANDLER_PROTOTYPE );
void MPE_DefaultHandler( sig )
int               sig
#elif defined(MPI_sun4)
#define SIG_HANDLER_PROTOTYPE int, int, struct sigcontext *, char *
void MPE_DefaultHandler ( SIG_HANDLER_PROTOTYPE );
void MPE_DefaultHandler( sig, code, scp, addr )
int               sig, code;
struct sigcontext *scp;
char              *addr;
#elif defined(MPI_IRIX)
#define SIG_HANDLER_PROTOTYPE int, int, struct sigcontext *
void MPE_DefaultHandler ( SIG_HANDLER_PROTOTYPE );
void MPE_DefaultHandler( sig, code, scp )
int               sig, code;
struct sigcontext *scp;
#else
/* The default Posix definition has a single int */
#define SIG_HANDLER_PROTOTYPE int
void MPE_DefaultHandler ( SIG_HANDLER_PROTOTYPE );
void MPE_DefaultHandler( int sig )
#endif
{
static char buf[128];

signal( sig, SIG_DFL );
if (sig >= 0 && sig <= 20)
    sprintf( buf, "Caught signal %s", SIGNAME[sig] );
else
    strcpy( buf, "Caught signal " );
fprintf( stderr, "%s\n", buf );

MPE_Start_debugger( );
}

Проверив файл config.log, я обнаружил:

$ find ./ -name 'config.log' | xargs grep 'HAVE_SIGHANDLER'
./src/mpe2/src/misc/config.log:| #define HAVE_SIGHANDLER_T 1
./src/mpe2/src/misc/config.log:#define HAVE_SIGHANDLER_T 1

Это подтверждает, что:

void MPE_DefaultHandler ( SIG_HANDLER_PROTOTYPE );
void MPE_DefaultHandler( sig )
int               sig

используется CPP.

Я обнаружил, что "SIG_HANDLER_PROTOTYPE" определяется как:

$ find ./ -name '*.c' | xargs grep 'SIG_HANDLER_PRO'
./src/mpe2/src/misc/src/dbxerr.c:#define SIG_HANDLER_PROTOTYPE sighandler_t

"sighandler_t" определяется в "/usr/include/signal.h" как:

typedef _sig_func_ptr sighandler_t; /* glibc naming */ 

Наконец, _sig_func_ptr определяется как:

 typedef void (*_sig_func_ptr)(int);

Это настолько, насколько мое собственное исследование заняло у меня, и я не могу соединить все воедино. Я не понимаю, почему существует несоответствие прототипа. Я буду продолжать пытаться решить эту проблему самостоятельно, но любая помощь будет принята с благодарностью!

Заранее спасибо!

ОБНОВИТЬ:

Я пересматривал вывод команды make и думаю, что допустил ошибку. Я предположил, что проблема была с декларацией:

void MPE_DefaultHandler ( SIG_HANDLER_PROTOTYPE );

Тем не менее, проблема, кажется, с определением:

void MPE_DefaultHandler( sig )

'sig' является типом int, но я не могу понять, что это за тип SIG_HANDLER_PROTOTYPE. Может кто-нибудь объяснить это:

 typedef void (*_sig_func_ptr)(int);

2 ответа

Если вы все еще хотите, чтобы MPICH работал в Windows, вы можете попробовать версию, упакованную Microsoft. Это производная от MPICH. Также доступна старая версия двоичного файла Windows. Вы можете узнать больше на странице загрузок для MPICH ( http://www.mpich.org/downloads/).

MPICH2 (сейчас просто "MPICH" для версий>= 3.0) в настоящее время не тестирует и не поддерживает Windows. Последняя рабочая версия для Windows - 1.4.1p1, и даже тогда я не уверен в статусе поддержки Cygwin.

Использование cygwin может быть лучшим выбором, если вам нужен MPICH2 v1.5 или MPICH v3.0.x. v3.0.2 не связывает с ним MPE, поэтому вы можете избежать некоторых проблем, которые вы упомянули. Вы также можете приблизить это поведение с 1,5, передав --disable-mpe в configure,

Другие вопросы по тегам