[#40647] RAA dead link check — "NAKAMURA, Hiroshi" <nakahiro@...>

なひです。

19 messages 2005/03/04
[#40685] Re: RAA dead link check — "NAKAMURA, Hiroshi" <nakahiro@...> 2005/03/20

-----BEGIN PGP SIGNED MESSAGE-----

[ruby-list:40721] socket.c compileエラー

From: KOBAYASHI Yasuhiro <kobayays@...>
Date: 2005-03-25 00:19:28 UTC
List: ruby-list #40721
こばやし と申します.

僕の環境(mingw32)では,ruby_1.8枝のext/socket で compile
error が発生しています.

env:
gcc-20040810-1(gcc (GCC) 3.3.3 (cygwin special))
mingw32-runtime-3.7-1
win32api-3.2-1

configure option:
./configure --with-gcc='gcc -mno-cygwin' --enable-shared
   --build=i386-pc-mingw32 --with-opt-dir=/usr/local

多分以下の様なことだと思います.

1. configure.inでCOMMON_MACROSに'WIN32_LEAN_AND_MEAN='が定義
   されている.

2. ext/socket/extconfig.rb の処理では,mkmf.rb中で
   COMMON_HEADERSにCOMMON_MACROSが追加定義されているので,結
   果的にwinsock.hがインクルードされるが、Makefileには
   COMMON_MACROSは反映されない.

3. 実際のcompile中では, WIN32_LEAN_AND_MEAN が定義されていな
   い(?)ため,windows.h内で winsock2.hがインクルードされる.

4. winsock2.h と ext/socket/socket.c 内の 'struct
   sockaddr_storage' が二重定義される.

error message とext/socket/mkmf.logの該当部分を添付します.

----- error message -----
compiling socket
make[1]: Entering directory `/home/kobayays/src/ruby/ext/socket'
gcc -mno-cygwin -g -O2   -I. -I../.. -I../../. -I../.././ext/socket -DHAVE_CLOSESOCKET -DHAVE_INET_NTOA -DHAVE_GETSERVBYPORT -Dsocklen_t=int -DHAVE_WSACLEANUP -DHAVE_GETHOSTNAME -I. -I/usr/local/include  -c socket.c
socket.c:116: error: redefinition of `struct sockaddr_storage'
make[1]: *** [socket.o] Error 1
make[1]: Leaving directory `/home/kobayays/src/ruby/ext/socket'
make: *** [all] Error 1
----- error message -----

----- ext/socket/mkmf.log -----

have_struct_member: checking for struct sockaddr_storage.ss_family... -------------------- no

"gcc -mno-cygwin -c -Ic:/home/kobayays/src/ruby -I../../. -I/usr/local/include  -g -O2    conftest.c"
conftest.c:7: error: dereferencing pointer to incomplete type
checked program was:
/* begin */
#define WIN32_LEAN_AND_MEAN 
#include <windows.h>
#include <winsock.h>

/*top*/
int main() { return 0; }
int s = (char *)&((struct sockaddr_storage*)0)->ss_family - (char *)0;
/* end */

--------------------

have_struct_member: checking for struct sockaddr_storage.ss_family... -------------------- no

"gcc -mno-cygwin -c -Ic:/home/kobayays/src/ruby -I../../. -I/usr/local/include  -Dss_family=__ss_family -Dss_len=__ss_len -g -O2    conftest.c"
conftest.c:7: error: dereferencing pointer to incomplete type
checked program was:
/* begin */
#define WIN32_LEAN_AND_MEAN 
#include <windows.h>
#include <winsock.h>

/*top*/
int main() { return 0; }
int s = (char *)&((struct sockaddr_storage*)0)->ss_family - (char *)0;
/* end */

----- ext/socket/mkmf.log -----

-- 
KOBAYASHI Yasuhiro <kobayays@otsukakj.co.jp>

In This Thread

Prev Next