• 締切済み

cygwin gcc c99 での isnormal と strtold の使用

Cygwinのgccで-std=c99オプションを付けて 以下のコードをコンパイルしようとしています。 #include <stdlib.h> #include <math.h> int main() { isnormal(0.123); strtold("0.123", NULL); return 0 ; } $> gcc -std=c99 test_strtold.c ですが、コンパイルできず、2つの関数とも'undefined reference'になります。 -std=c99を付けてコンパイルする方法または この記述と同等の別の記述がありましたらご教授願います。 よろしくお願いいたします。

みんなの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

#2です。 先ほどは、-std=gnu99 -mno-cygwinと書きましたが、-std=c99 -mno-cygwinでもコンパイルできます。 ただし、別の問題が発生する可能性大です。 というのは、-mno-cygwinを指定するとMinGWとしてコンパイルすることになるのですが、このprintf系関数(scanf系も)でlong double型を使うことができません。 厳密なエラーチェックができなくなりますが、strtoldの代わりにsscanfを使えば、-mno-cygwinなしでもコンパイルできますので、総合的に考えるとその方がよいかもしれません。

taichik15
質問者

お礼

回答ありがとうございます。 std=c99でstrtoldの代わりにsscanfを使うことにします。 isnormalは、何かほかの方法を探してみることにします。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.3

http://www.gnu.org/software/hello/manual/gnulib/strtold.html によると、strtold()についてはCygwinはmissing、つまり「未対応」ってことのようです。 isnormal()の方も、おそらく「C99に対応しているisnormal()」がないのではないでしょうか?

taichik15
質問者

お礼

回答ありがとうございます。 では、残念ですが、違う記述もしくは、 -std=gnu99 -mno-cygwin で対応しようと思います。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

CygwinのライブラリはC99に完全対応しているわけではありません。 -std=c99の代わりに-std=gnu99 -mno-cygwinを指定すればおそらく解決すると思います。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

-std=c99をつけた場合「だけ」起こる現象ですか? 状況的には↓に見えるんですが。 http://d.hatena.ne.jp/mickey24/20081008/1223463875

taichik15
質問者

補足

-std=c99を付けなければ、 $> gcc test_strtold.c エラーは undefined reference to `_strtold' のみです。 -std=c99を付ければ、 undefined reference to `_isnormal' undefined reference to `_strtold' とふたつともです。 また、-lmをつけても結果は同じです。 ちなみに、 Red Hat Enterprise Linux ES release 4 の gcc v3.4.6 では、 $> gcc -std=c99 test_strtold.c でコンパイルは通り、 Ubuntu 7.10 の gcc v4.1.3 では、 gcc -std=c99 -lm test_strtold.c でコンパイルは通りました。 cygwinでのgccのバージョンは、3.4.4です。

関連するQ&A

  • cygwinのgccが、エラーになってしまいます。

    テストプログラム $ cat test.c #include <stdio.h> int main (void) { printf("Hello, World!\n"); return 0; } これを、コンパイルすると $ gcc test.c gcc: error trying to exec '/usr/lib/gcc/i686-pc-cygwin/4.5.3/cc1.exe': execv: Bad address /usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../libcygwin.a(libcmain.o):(.text+0xba): undefined reference to `_WinMain@16' collect2: ld はステータス 1 で終了しました と、このようなエラーが出てきました。 ファイルを確認しても、何も作られていません。 $ ls test.c 対処方法を、ご教示願います。

  • cygwinのgccで正常にコンパイルできない。

    cygwinのgccで正常にコンパイルできない。 cygwinのvimで、以下のプログラムを書きました。 ------------------------------------------------------------- #include <stdio.h> int main(void) { int no; printf("Please input something:"); scanf("%d", &no); printf("It is %d that you input it:\n", no); return (0); } ------------------------------------------------------------- それからgccでコンパイルしました。 コマンドは以下の通りです。 $ gcc test.c すると以下のエラーが出ました。 test.c:10:9: warning: unknown escape sequence: '\033' このようにコンパイルできない状態です。 どのようにすると正常にコンパイルできるようになるでしょうか?

  • MingwでC++のソースがコンパイルできない。

    質問があるのですがよろしくお願いしします。 プラットフォームは Windows HOME です。 MinGWでC++のhelloworld.cppという名前のプログラム ------ここから----------- #include <iostream> using namespace std; int main(){ cout <<"Hello World!!\n"; return 0; } -------ここまで----------- を、gcc helloworld.cpp とWindowsのコマンドプロンプトから打ってコンパイルしようとしたのですが、 undefined reference to std string::size() const undefined reference to std string::operator[](using int) const undefinrd reference to std::cout undefinrd reference to std::basic_ostream<char, std::char traits<char> >&, char const*) undefinrd reference to std::ios_base::Init::() undefinrd reference to std::ios_base::~Init::() などのエラーが出て、コンパイルできません・・ hello.cという名前のC言語プログラム --------ここから------ #include<stdio.h> int main(void){ printf("Hello GCC World on Windows!!\n"); } ------ここまで------- は、gcc hello.c で正常にコンパイルでき、生成したexeファイルも正常に動きます。 また、eclipse CDT上からc++プログラムをMinGWでコンパイルすることもできるのですが・・ なぜかWindowsのコマンドプロンプトからc++プログラムをコンパイルしようとするとエラーが出てしまいます。(C言語のプログラムでもエラーが出ることが時々あります。) どなたか詳しい方いらっしゃいましたらご教授頂けると幸いです。 よろしくお願いします。

  • Windowsコモンコントロールのcygwin/gccコンパイルエラー

    以下のサイトのようなWindowsコモンコントロールのプログラムをcygwin/gccコンパイルするとエラーがでます。 (sourceのサイト) http://wisdom.sakura.ne.jp/system/winapi/common/common16.html (ビルドコマンド) gcc -mwindows -mno-cygwin -o main.exe main.cpp (エラー出力) undefined reference to `_ImageList_Destroy@4' undefined reference to `_InitCommonControls@0' undefined reference to `_ImageList_Create@20' undefined reference to `_ImageList_ReplaceIcon@12' undefined reference to `_ImageList_ReplaceIcon@12' collect2: ld returned 1 exit status make: *** [main.exe] Error 1 Windowsコモンコントロールを含んだプログラムをcygwin/gccコンパイルするにはどうすればよいでしょうか? コンパイルは出来ないのでしょうか? よろしくお願いします。

  • Cygwinのgccについて

    駄文で申し訳ありません。 cygwinのgccでC言語で作成したプログラムをコンパイルしたんですが、以下のようなコメントが返ってきました。 これはどういう意味なんでしょうか?warningなんで無視できるのでしょうか? ご教授下さい。 $gcc sample.c sample.c:60:2: warning: no newline at end of file /cygdrive/c/DOCUME^1/ユーザ名/LOCALS^1/Temp/cc6gA6nk.o:sample.c(.text+0xd7): undefined reference to _perro' collect2: ld returned 1 exit status

  • cygwinでのgcc

    畏れ入ります。 UNIXどタコですm(__)m 最近CYGWINで簡単にUNIXが体験できるということで早速インストールしました。 KDEとGNOME無事起動しました。 で、実は図書館で「Xlibで簡単プログラミング」というのを借りてきたので、ちょっと遊んでみようと思いとりあえずc言語がコンパイル、実行できるかどうかやってみたのですがうまくいきませんでした。 #include <stdio.h> int main(){ printf("HelloWorld \n"); } のようなプログラムをvimで作成するところまではうまくいきました。homeディレクトリに作成されていました。 それで gcc hello.c とやればよいのですよね?! 実は文字がたくさん出て、コンパイルできたのかどうか・・・?そして、a.outというファイルができるのですよね?間違っていますでしょうか? とりあえず、できていません・・・(>_<) ./a.out としても、no fileです・・・ なにか間違っていますでしょうか?

  • C言語コンパイラーエラーについて教えてください。

    C言語でコンパイルができなくて困っています。 コンパイルをすると、 ----------------------------------------- test.c.20:undefined reference to `getcury' test.c:20: undefined reference to `getcurx' collect2: ld returned 1 exit status ----------------------------------------- と言うエラーが出てしまい、コンパイルが完了しません。 ソースは、「test.c」と言うファイルネームで、内容は ----------------------------------------- #include <stdio.h> #include <stdlib.h> #include <curses.h> int main (void) { int y = 0, x = 0; initscr(); getyx(curscr, y, x); printw("x = %d, y = %d", x, y); refresh(); getchar(); endwin(); return 0; } ----------------------------------------- です。 OSは、Windows7 Professional SP1 コンパイラーは、MinGW Ver5.1.6. で、コマンドは gcc -o test.exe test.c -lcurses です。 確かに、curses へはパスも通っており、リンクできているようなんですが、 エラーが出てしまいます。 どうすれば良いのかわからず、大変困っています。 だれかご存知の方、教えてください。 どうかよろしくお願い致します。

  • Cygwinをいれました

    アルサイトからいれました、でもヘッダファイルがなくてgcc でコンパイルすると #include <stdio.h> #include <math.h> などで引っかかってコンパイルがとおりません。ヘッダファイルだけ欲しいのですが、どっからとってこれませんか?

  • C言語(C89)での文字列代入

    C言語文法のうち、gcc 拡張機能を含まない C89 規格で、 文字列の「= での代入」は可能なんでしょうか? strcpy が必要だと思っていました。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(){ char *p; p=malloc(30); p="Hello"; printf("%s\n",p) return 0; } gcc で gcc -Wall -std=c89 -pedantic-errors としてコンパイルしても なんのエラー表示もなく正常に動作しています。 これまでC89では「=での文字列代入」は(宣言時を除いて)できない と思ってたので不思議です。 ちなみに、free(p) を return 0; の前に入れると、エラーになります。 情報処理技術者試験(試験で要求される規格はC89)を受ける知り合い から質問されたのがきっかけです。

  • cではよくてc++ではダメな理由

    #include <stdio.h> #include <stdlib.h> int main(void) { int *x; x = calloc(1, sizeof(int)); if (x == NULL) puts("記憶域の確保に失敗しました。"); else{ *x = 57; printf("*x = %d\n", *x); free(x); } return 0; } 上のソースなのですがcallocの戻り値がvoidなのでintにはキャストしてくれみたいなことを コンパイラに言われます。 cではコンパイルできてc++ではコンパイルできないのはなぜでしょう。

専門家に質問してみよう