正在尝试使用Cygwin在Windows计算机上编译MPICH2。
一点相关信息
- $uname->CYGWIN_NT-6.1
- $gcc--版本->gcc(gcc)3.4.4(cygming special,gdc 0.12,使用dmd 0.125)版权所有(C)2004自由软件基金会,股份有限公司。这是免费软件;有关复制条件,请参见来源。没有担保甚至不考虑适销性或特定用途的适用性
- 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, "%sn", buf );
MPE_Start_debugger( );
}
通过检查"配置日志",我发现:
$ 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);
MPICH2(对于版本>=3.0,现在仅为"MPICH")当前不测试或支持Windows。Windows上的最后一个工作版本是1.4.1p1,即便如此,我也不确定Cygwin支持的状态。
如果您需要MPICH2 v1.5或MPICH v3.0.x,那么使用cygwin可能是您的最佳选择。v3.0.2没有将MPE与之捆绑在一起,因此您可以避免您提到的一些问题。通过将--disable-mpe
传递给configure
,也可以用1.5近似此行为。
如果您仍然想让MPICH在Windows上运行,您可以尝试Microsoft打包的版本。它是MPICH的衍生产品。还有一个旧版本的Windows二进制文件可用。您可以在MPICH的下载页面上找到更多信息(http://www.mpich.org/downloads/)。