わたなべです.

"Nobuyoshi.Nakada" <nobu.nakada / nifty.ne.jp> writes:

:  -static をつけないと lib*.dll.a を先に探してくれるわけですか。dllwrap 
:だとダメなようですが、やり方が悪いのかな。

Cygwin 1.1.0 からは gcc -shared が使えるから dllwrap は要ら
ないと思ったら, どうも変数の symbol がうまく export できなく
て役立たずの DLL ができあがって悩みました.
#でも, .def を使えばいいのか. 試してみよう.

今は Linux 上なもんで cross な環境ですが, -static でちゃんと
目的のライブラリがリンクされてます.
ruby-zlib-0.3.1 で試しました.

% i686-pc-cygwin-dllwrap --target=cygwin --as=i686-pc-cygwin-as \
  --dlltool-name=i686-pc-cygwin-dlltool \
  --driver-name=i686-pc-cygwin-gcc --export-all -s --def=zlib.def \
  -L/install/i386-cygwin/usr/local/lib -L/usr/local/cygwin/lib \
  -o zlib.so zlib.o  -L. -lruby -lz
% ls -l zlib.so
-rwxr-xr-x   1 watanabe ruby        26112 Aug 25 00:33 zlib.so
% i686-pc-cygwin-objdump -p zlib.so | grep 'DLL Name'
	DLL Name: ruby.cygwin.dll
	DLL Name: cygwin1.dll
	DLL Name: KERNEL32.dll
	DLL Name: libz.dll
% i686-pc-cygwin-dllwrap --target=cygwin --as=i686-pc-cygwin-as \
  --dlltool-name=i686-pc-cygwin-dlltool \
  --driver-name=i686-pc-cygwin-gcc --export-all -s --def=zlib.def \
  -L/install/i386-cygwin/usr/local/lib -L/usr/local/cygwin/lib \
  -o zlib.so zlib.o  -L. -lruby -lz -static
% ls -l zlib.so
-rwxr-xr-x   1 watanabe ruby        61952 Aug 25 00:34 zlib.so
% i686-pc-cygwin-objdump -p zlib.so | grep 'DLL Name'
	DLL Name: ruby.cygwin.dll
	DLL Name: cygwin1.dll
	DLL Name: KERNEL32.dll

というわけで /usr/lib/lib*.dll.a の存在にも注意しましょう.

あ, それとこの結果を見るとちょっと驚くかも.
% i686-pc-cygwin-gcc -Wl,--verbose foo.c -LHOGE -lz |& grep HOGE
attempt to open HOGE/libz.dll.a failed
attempt to open HOGE/z.dll.a failed
attempt to open HOGE/libz.a failed
attempt to open HOGE/libz.dll failed
attempt to open HOGE/z.dll failed
attempt to open HOGE/libz.a failed
attempt to open HOGE/libz.dll.a failed
attempt to open HOGE/z.dll.a failed
attempt to open HOGE/libz.a failed
attempt to open HOGE/libz.dll failed
attempt to open HOGE/z.dll failed
attempt to open HOGE/z.lib failed

z.lib も探すし, DLL も直接リンクできるようになってます.
これも変数の symbol がいまいちな感じだけど.

-- 
わたなべひろふみ