ctime_r宣言が無いのに何故かコンパイルが通る

このQ&Aのポイント
  • MinGW 5.1.3 (Full Install)を使用して、ctime_rが宣言されていないにも関わらずコンパイルが通る現象が起きました。
  • ソースコードの実行エラーが発生するはずですが、コンパイルは成功します。
  • インクルードパスにctime_rが含まれていないにもかかわらず、なぜコンパイルが通るのか理由を知りたいです。
回答を見る
  • ベストアンサー

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ライブラリはアンインストールしています。

質問者が選んだベストアンサー

  • ベストアンサー
  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.2

gcc なら、-Wall とか -Wimplicit とか -Wimplicit-function-declaration などのオプションをつけておけば、宣言のない関数の呼び出しは、ワーニングメッセージを出力しますが、エラーするオプションがあるかどうかは知りません^^;

hekkusyoi
質問者

お礼

ありがとうございます。 関数を使う前に「宣言・もしくは定義」されていないと使えないものだと思い込んでいました。 「宣言されていない場合は勝手に整数型の関数として解釈される」という挙動は初耳でした。 http://www.wakhok.ac.jp/~kanayama/C/01/node87.html 普段 -Wall をつける癖がついていなかったで、これを機につけるよう心がけようと思います。

その他の回答 (1)

  • mikaemi
  • ベストアンサー率50% (33/65)
回答No.1

C言語だとコンパイルはできるんじゃないですか? 使用している関数の事前の宣言がなくても。もちろん、リンクエラーにはなりますけど。 C++ならコンパイルエラーになりますが。。。

関連するQ&A

  • FFTWでコンパイルができません。

    FFTWでコンパイルができません。 http://www32.atwiki.jp/amaeda/pages/12.html ↑のソースファイルをコンパイルすると以下のエラーが出ます。↓ >gcc -o fftw1D fftw1D.c -lfftw3 -lm (MinGW) c:/mingw/bin/../lib/gcc/mingw32/4.5.0/../../../../mingw32/bin/ld.exe: cannot find -lfftw3 collect2: ld returned 1 exit status FFTWはわからないので、教えてください。

  • MinGWのg++で分割コンパイルエラー

    MinGW環境でC++の勉強を始めました。 簡単なサンプルのコンパイルをしてみたのですが、ソースファイルを一括してコンパイルすると問題ないのですが、個別にコンパイルしようとするとエラーがでてしまいまいます。 原因や対処法をご存じの方がいらっしゃいましたらご教示下さい。 一括でコンパイルすると問題なし bash-3.1$ g++ -Wl,--enable-auto-import main.cpp point.cpp -lstdc++ 個別にコンパイルしようとした場合 bash-3.1$ g++ -Wl,--enable-auto-import -o main.o main.cpp C:\DOCUME~1\user\LOCALS~1\Temp\ccZrVmLp.o:main.cpp:(.text+0x16): undefined reference to `Point::Point()' C:\DOCUME~1\user\LOCALS~1\Temp\ccZrVmLp.o:main.cpp:(.text+0x32): undefined reference to `Point::Point(int, int)' C:\DOCUME~1\user\LOCALS~1\Temp\ccZrVmLp.o:main.cpp:(.text+0x3e): undefined reference to `Point::println()' C:\DOCUME~1\user\LOCALS~1\Temp\ccZrVmLp.o:main.cpp:(.text+0x4a): undefined reference to `Point::println()' collect2: ld returned 1 exit status ※ -Wl,--enable-auto-importは、他の警告を消すために入れました、無くても質問の問題に変化はありませんでした。 サンプルソース ---main.cpp--- #include<iostream> #include "point.h" using namespace std; int main(){ Point p1,p2(4,5); p1.println(); p2.println(); return 0; } ----------- ---point.h--- class Point { private: int x, y; static int count; public: Point(); Point( int, int ); void set( int, int ); void println(); }; ------------- ---point.cpp--- #include<iostream> #include"point.h" using namespace std; int Point::count; Point::Point(){ this->x = this->y = 0; ++count; } Point::Point(int ax, int ay){ this->x = ax; this->y = ay; ++count; } void Point::set( int ax, int ay ){ this->x = ax; this->y = ay; } void Point::println(){ cout << "Point(" << x << "," << y << ")" << endl; } ----------- bash-3.1$ g++ -v Using built-in specs. COLLECT_GCC=D:\MinGW\bin\g++.exe COLLECT_LTO_WRAPPER=d:/mingw/bin/../libexec/gcc/mingw32/4.5.0/lto-wrapper.exe Target: mingw32 Configured with: ../gcc-4.5.0/configure --enable-languages=c,c++,ada,fortran,obj c,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgo mp --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-r untime-libs --disable-werror --build=mingw32 --pref

  • bccは分かりましたがgccが使えません

    Cのソースの#include <stdio.h>でエラーになります。 gccではbccのbcc32.cfgで行うような設定はどのようにすればよいですか? MINGWのコンソールで $ echo $C_INCLUDE_PATH c:/msys/1.0/mingw/include;c:/msys/1.0/mingw/lib/gcc/mingw32/3.4.5/include このように出ます。 $ gcc myapp.c で#include <stdio.h>の行でコンパイルエラーです。 MINGWでは$C_INCLUDE_PATHを正しく設定できているみたいですが、gcc.exeにそれが伝わっていないみたいです。 AUTOEXEC.BATには何も追記したくないので何も追記していません。 どうすればライブラリのパスを通せますか?

  • windowsでLinuxで作成したソースをコンパイル

    Linuxで作成、 $gcc -Wall file.c で、通ったファイルをWindowsでも同様に通したいので、MinGWを使って、コンパイルしたのですが、 #include <sys/socket.h> の構文で引っかかってしまいました。どうやらインクルードファイルが無いようでしたので、 C:\MinGW\include C:\MinGW\lib 以下に、Linuxの /usr/include/ /usr/lib/ 以下のファイルをそのまま入れて、再度実行しました。 ヘッダーファイルは見つけて読んでくれたのですが、そのヘッダーファイルに書いてある関数(例:htons(), socket(), inet_addr(), connect())が参照できないとの事で、怒られてしまいます。 Linuxのライブラリファイルをそのまま入れたのがまずかったのかもしれないのですが、こいつのエラーを解消する有効手段が見つかりません。 問題解決のヒント、又は答えを教えていただけませんでしょうか。 どうか、お願い致します。

  • cygwinのgccによるコンパイルうまくいかない

    cygwinをsetup.exeからminimum installしました。 追加的にgcc emacs xwindow system xwin terminalをインストールしました。 そしてターミナルを起動してgcc test.c -o test.exe と入力すると/home/test.c:1: error: bad value (generic) for -mtune= switch と、エラーが出てうまくコンパイル出来ません。 mtune=generic,native,i386...k6,athlon-xp..c6-2などいろいろ試しましたが全て失敗。 どうやったらコンパイルが出来るようになるか教えてください! 環境: >gcc -v >Using built-in specs. COLLECT_GCC=gcc Target: i686-pc-cygwin コンフィグオプション: /gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/src/gcc-4.5.3/configure --srcdir=/gnu/gcc/releases/respins/4.5.3-3/gcc4-4.5.3-3/src/gcc-4.5.3 --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --libexecdir=/usr/lib --datadir=/usr/share --localstatedir=/var --sysconfdir=/etc --datarootdir=/usr/share --docdir=/usr/share/doc/gcc4 -C --datadir=/usr/share --infodir=/usr/share/info --mandir=/usr/share/man -v --with-gmp=/usr --with-mpfr=/usr --enable-bootstrap --enable-version-specific-runtime-libs --libexecdir=/usr/lib --enable-static --enable-shared --enable-shared-libgcc --disable-__cxa_atexit --with-gnu-ld --with-gnu-as --with-dwarf2 --disable-sjlj-exceptions --enable-languages=ada,c,c++,fortran,java,lto,objc,obj-c++ --enable-graphite --enable-lto --enable-java-awt=gtk --disable-symvers --enable-libjava --program-suffix=-4 --enable-libgomp --enable-libssp --enable-libada --enable-threads=posix --with-arch=i686 --with-tune=generic --enable-libgcj-sublibs CC=gcc-4 CXX=g++-4 CC_FOR_TARGET=gcc-4 CXX_FOR_TARGET=g++-4 GNATMAKE_FOR_TARGET=gnatmake GNATBIND_FOR_TARGET=gnatbind --with-ecj-jar=/usr/share/java/ecj.jar スレッドモデル: posix gcc version 4.5.3 (GCC) test.cのsource #include <stdlib.h> #include <stdio.h> int main(void) { printf("Hello World!\n"); return 0; [EOF] 素人なので解決するために他に足りない情報があればおしえてくださいね。

  • エラー Permission denied

    現在、mingwで94個のプログラムをコンパイルするのにGNUMAKEを使っています。 make all で登録されたプログラムを全コンパイルすると、 その過程で133個のオブジェクトファイルが作られるのですが、途中で次のようなエラーが発生することがあります。 「することがある」というのが厄介な点で、ソースコードを一切変更せずに同じ操作をしても、 エラーが出るタイミングが違うのです。 まったくエラーの出ないこともありますが、たいがいは中盤で次のようなメッセージを出力して停止します。 gcc --input-charset=cp932 --exec-charset=cp932 -Wall -s -O3 -Os -c -o atgc_ratio.obj atgc_ratio.c gcc --input-charset=cp932 --exec-charset=cp932 -Wall -s -O3 -Os -c -o Lib-atgc_count.obj Lib-atgc_count.c gcc -Os -o atgc_ratio.exe atgc_ratio.obj Lib-klonoa.obj Lib-arg2.obj Lib-strdata.obj Lib-log.obj Lib-strdata2.obj Lib-atgcarryget2.obj Lib-atgc_count.obj Lib-file.obj Lib-calender.obj Lib-command.obj c:/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: reopening atgc_ratio.exe: Permission denied c:/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: final link failed: Permission denied collect2.exe: error: ld returned 1 exit status make: *** [atgc_ratio.exe] Error 1 上記の例ですと、atgc_ratio.exe をコンパイルしている最中に、「Permission denied」なるものが発生し、makeが動作停止しているものと解釈しております。 再度make all すると何事も無かったかのようにatgc_ratio.exeに必要なオブジェクトファイルをリンクして作業を続行します。 borland C++ compiler 5.5.1(古い!!)でも時たま同じようなエラーが発生するようですが、 そもそもこっちは12年前からバージョンアップしてないので、しょうがないかな?と思います。 一応、-Wall で無警告になるようメンテナンスはしているので、ソースコード自体の問題ではないと思います。 何らかのソフトがファイルをロックしているのかと思い、とりあえずアンチウィルスソフトを一時的に停止してみましたが、 やはりエラーは出ました。 マルチスレッドの問題?とも思ったのですが、マルチスレッドとかマルチコアなどの分野に手を出したことがありませんので見当がつかない状態です。 また最近シングルCPUのWinXP環境から Intel(R) Core(TM) i3-3110M CPU @ 2.40GHz のWin7(32ビット)に移行したばかりで、 マルチCPUなどの使用経験も非常に浅いので、windowsの問題か、コンパイラの問題か、makeなど開発環境の問題か、原因の切り分けができておりません。 これらの問題の原因や対策について詳しい方、ご教授いただければと思います。 現在の環境を次にまとめます。 OS:Windows 7 Professional 32ビット版 (Serbice Pack1) 開発環境:mingw 4.7.2 (mingw-get-inst-20120426.exe を使って最新版をダウンロードしたもの)  コンパイラ:gcc 4.7.2  リンカ:GNU ld (GNU Binutils) 2.23.1  make:GNU Make 3.81 gcc -v の結果 Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.7.2/lto-wrapper.exe Target: mingw32 Configured with: ../gcc-4.7.2/configure --enable-languages=c,c++,ada,fortran,obj c,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgo mp --disable-win32-registry --enable-libstdcxx-debug --disable-build-poststage1- with-cxx --enable-version-specific-runtime-libs --build=mingw32 --prefix=/mingw Thread model: win32 gcc version 4.7.2 (GCC) make -v の結果 GNU Make 3.81 Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This program built for i686-pc-msys オブジェクトのコンパイルには次のコマンドを使っています。 gcc --input-charset=cp932 --exec-charset=cp932 -Wall -s -O3 -Os -c -o リンクには次のコマンドを使っています。 gcc -Os -o なお、gccはデフォルトではオブジェクトファイルの拡張子を.oにしますが、 borland C++ も使う関係で、-oオプションでファイル名を直接指定して拡張子を統一しています。 どうかよろしくお願いします。

  • MinGWをXPにインストール後 DOSのipconfig など使えな

    MinGWをXPにインストール後 DOSのipconfig など使えなくなる 標記の通り、昨日MinGWというC言語の環境をインストールした。 それに応じてシステムの環境関数もいくつか追加した。下記: 1 MINGW_PATH=G:\MinGW 2 C_INCLUDE_PATH=%MINGW_PATH%\include;%MINGW_PATH%\lib\gcc\mingw32\3.4.5\include 3 CPLUS_INCLUDE_PATH=%MINGW_PATH%\include\c++\3.4.5;%MINGW_PATH%     \include\c++\3.4.5\mingw32;%MINGW_PATH%\include\c++\3.4.5backward;%C_INCLUDE_PATH% 4 LIBRARY_PATH=%MINGW_PATH%\lib;%MINGW_PATH%\lib\gcc\mingw32\3.4.5 5 PATH=%MINGW_PATH%\bin;%MINGW_PATH%\libexec\gcc\mingw32\3.4.5 そうしてから、DOSでipconfig 出来なくなるだけじゃなく、社内用のメールボクスも開けなくなる。 一体なぜか? どなたか教えていただきませんか

  • コンパイル

    コンパイルしましたが、\mingw\lib\gcc\mingw32\3.4.5\..\..\..\..\mingw32\bin\ld.exe: cannot find -ldb-4.5 collect2 ld returned 1 exit statusというメッセージが表示されます。 コマンドプロンプトでcd C:\Users\xxxxx\Desktop\srcと入力し、cobc -x -std=cobol85 pro1.cblと入力した結果です。ソースはC:\Users\xxxxx\Desktop\srcにあります。MinGWとOpenCOBOLの動作確認はできています。

  • C++言語でのライブラリファイルの作成と使用法

    よろしくお願いします。 C言語において、例えばMinGWのCコンパイラのLibディレクトリには、拡張子が「.a」のライブラリファイルがたくさん存在しています。これらは、arコマンドで ar crv libMine.a 1.o 2.o のように作成されるものだと認識しています。 一方、C++言語において、例えばBorlandのC++コンパイラのLibディレクトリには、拡張子が「.lib」というライブラリファイルがたくさん存在します。 これらのファイブラリファイルは、C言語のaファイルと同じ役割をする考えてよいのでしょうか? また、C++において自作のライブラリファイル(libファイル)を作成するにはどうすればよいのでしょうか? 次に、C++における自作ライブラリの使用法についてですが、Cではコンパイル時に gcc -o 1.exe 1.c libMine.a のようにして、自作のライブラリファイルを使うことができますが C++のコンパイルコマンド、例えばbcc32コマンドを使ってコンパイルする時に、 自分が作成したlibファイルを使うにはどのようにすればよいのでしょうか? 最後に、Borland C++コンパイラをインストールするときに、Binディレクトリにあるbcc.cfgファイルに -L"c:\Borland\Bcc55\lib" と記述したのですが、これは、 c:\Borland\Bcc55\libにあるlibファイルをコンパイル時に自動的に読み込むということなのでしょうか?

  • gccのコンパイルが出来ません

    gcc(MinGW)をインストールをして、binにPATHを通したのですが、コンパイルしてみると gcc: installation problem, cannot exec `cc1plus': No such file or directory というエラー文がでました。 解決方法をどなたか教えて下さい;; OS は XP Professional SP2 です。 http://www.knatech.info/Dev-mingw-install.htmlを参考にしました。

専門家に質問してみよう