Re: Windows Vista での不具合 ― 2007年01月23日 00時39分39秒
-lmsvcr71をつければ単純なプログラムでは問題が解決しました。
しかし、namazu.exe の場合は
C:\> objdump -p namazu.exe | grep dll
DLL Name: KERNEL32.dll
DLL Name: msvcrt.dll
DLL Name: msvcr71.dll
DLL Name: msvcrt.dll
のように msvcrt.dll もリンクされてしまっています。
gcc のspecsファイルを書き換えても msvcrt.dll がリンクされてしまいます。
両方リンクされていると、spawn で(メモリ関係の)不具合が生じるようで、実行途中で落ちました。
それではということで、MinGw でコンパイルするのをあきらめ、VC++ でコンパイルすることを考えています。
そこで、次のような単純なプログラムをVC++でコンパイルしてテストしてみました。
(ワイルドカード展開するには setargv.obj をリンクします。)
#include <stdio.h>
#include <stdlib.h>
main(int argc, char *argv[])
{
int i;
for (i = 0; i < argc; i++) {
fprintf(stdout, "%d [%s]\n", i, argv[i]);
}
}
すると VC++ 2005 だと msvcr80.dll とリンクされるためか、Windows Vista でなくても、期待する正しい動作はしないことがわかりました。
仕方がないので VC++ 6.0 でコンパイルすると、Windows Vista でも期待する動作となりました。
どうやら、msvcr80.dll 辺りの仕様変更(か、バグ)が今回の原因のようです。
ということで、次は namazu.exe を VC++ 6.0 でコンパイルして試してみようと思います。
しかし、namazu.exe の場合は
C:\> objdump -p namazu.exe | grep dll
DLL Name: KERNEL32.dll
DLL Name: msvcrt.dll
DLL Name: msvcr71.dll
DLL Name: msvcrt.dll
のように msvcrt.dll もリンクされてしまっています。
gcc のspecsファイルを書き換えても msvcrt.dll がリンクされてしまいます。
両方リンクされていると、spawn で(メモリ関係の)不具合が生じるようで、実行途中で落ちました。
それではということで、MinGw でコンパイルするのをあきらめ、VC++ でコンパイルすることを考えています。
そこで、次のような単純なプログラムをVC++でコンパイルしてテストしてみました。
(ワイルドカード展開するには setargv.obj をリンクします。)
#include <stdio.h>
#include <stdlib.h>
main(int argc, char *argv[])
{
int i;
for (i = 0; i < argc; i++) {
fprintf(stdout, "%d [%s]\n", i, argv[i]);
}
}
すると VC++ 2005 だと msvcr80.dll とリンクされるためか、Windows Vista でなくても、期待する正しい動作はしないことがわかりました。
仕方がないので VC++ 6.0 でコンパイルすると、Windows Vista でも期待する動作となりました。
どうやら、msvcr80.dll 辺りの仕様変更(か、バグ)が今回の原因のようです。
ということで、次は namazu.exe を VC++ 6.0 でコンパイルして試してみようと思います。
最近のコメント