Cygwinを使用してWindowsマシンでMPICH2をコンパイルしようとしています。
関連情報のビット
- $ uname-> CYGWIN_NT-6.1
- $ gcc --version-> gcc(GCC)3.4.4(cygming special、gdc 0.12、using 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);