ctime_r宣言が無いのに何故かコンパイルが通る
MinGW 5.1.3 (Full Install) で以下のソースをコンパイルしたところ、ctime_rが何処にも宣言されていないのに何故かコンパイルが通りました。
/* a.c */
#include <time.h>
int main() {
//(実行エラーにはなるはずだが、コンパイルは出来るはず)
ctime_r(NULL, NULL);
return 0;
}
$ gcc -v -c a.c
Reading specs from C:/MyPrograms/MinGW/lib/gcc/mingw32/3.4.2/specs
Configured with: ../gcc/configure --with-gcc --with-gnu-ld --with-gnu-as --host=mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable-languages=c,c++,f77,ada,objc,java --disable-win32-registry --disable-shared --enable-sjlj-exceptions --enable-libgcj --disable-java-awt --without-x --enable-java-gc=boehm --disable-libgcj-debug --enable-interpreter --enable-hash-synchronization --enable-libstdcxx-debug
Thread model: win32
gcc version 3.4.2 (mingw-special)
cc1 -quiet -v -iprefix C:\MyPrograms\MinGW\bin\../lib/gcc/mingw32/3.4.2/ a.c -quiet -dumpbase a.c -auxbase a -version -o ./ccyAbaaa.s
ignoring nonexistent directory "C:/MyPrograms/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../mingw32/include"
ignoring nonexistent directory "/mingw/include"
ignoring nonexistent directory "/mingw/include"
ignoring nonexistent directory "/mingw/lib/gcc/mingw32/3.4.2/include"
ignoring nonexistent directory "/mingw/mingw32/include"
ignoring nonexistent directory "/mingw/include"
#include "..." search starts here:
#include <...> search starts here:
C:/MyPrograms/MinGW/bin/../lib/gcc/mingw32/3.4.2/../../../../include
C:/MyPrograms/MinGW/bin/../lib/gcc/mingw32/3.4.2/include
End of search list.
GNU C version 3.4.2 (mingw-special) (mingw32)
compiled by GNU C version 3.4.2 (mingw-special).
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
as -o a.o ./ccyAbaaa.s
ところがリンクはエラーになります。
$ gcc -v a.o
(略)
ld -Bdynamic C:/MyPrograms/MinGW/lib/crt2.o C:/MyPrograms/MinGW/lib/gcc/mingw32/3.4.2/crtbegin.o -LC:/MyPrograms/MinGW/lib/gcc/mingw32/3.4.2 -LC:/MyPrograms/MinGW/lib/gcc -LC:/MyPrograms/MinGW/mingw32/lib -LC:/MyPrograms/MinGW/lib a.o -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt -luser32 -lkernel32 -ladvapi32 -lshell32 -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt C:/MyPrograms/MinGW/lib/gcc/mingw32/3.4.2/crtend.o
a.o:a.c:(.text+0x3a): undefined reference to `ctime_r'
なぜコンパイルはできるんだろうと思ったのですが、やはりインクルードパスにあるヘッダ群に ctime_r らしきものはやはり見当たりません。
$ find . -type f | xargs grep "ctime_r"
$ find C:/MyPrograms/MinGW/include -type f | xargs grep "ctime_r"
$ find C:/MyPrograms/MinGW/lib/gcc/mingw32/3.4.2/include -type f | xargs grep "ctime_r"
$
なぜコンパイルが通っているのでしょうか?
[補足]
このテストを行う前に GnuWin32 の libgw32c(glibc互換ライブラリで、この中のtime.hはctime_rを含む) をインストールしてコンパイル&リンクを試みましたが、やはりリンクエラーが出ていました
$ gcc -I/path/to/glibc a.c -lgw32c
undefined reference to `ctime_r'
今回の質問のテストを行う前にlibgw32cライブラリはアンインストールしています。
お礼
続けてアドバイスいただき感謝します。
補足
ご指摘のとおり、「MinGW mintty」で検索しminttyをインストールし端末エミュレータとして使用したところ、うまく黄色の文字が表示されました。ありがとうございます。コマンドプロンプトと端末エミュレータのことをもう少し勉強したいと思います。