• 締切済み

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 へはパスも通っており、リンクできているようなんですが、 エラーが出てしまいます。 どうすれば良いのかわからず、大変困っています。 だれかご存知の方、教えてください。 どうかよろしくお願い致します。

みんなの回答

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

> おっしゃられる通り、MinGWをインストールしただけではcursesは入らなかったので、UNIX の curses.h を持って来たり、pdcurses-2.6-bin を入れたり、pdc34dllw を入れたりで、ヘッダとライブラリがめちゃくちゃになっている気がします。 素性がはっきりしていて、かつMinGWに適合するバイナリが入手できたのであればよいのですが、そうでなければうまくいかなくて当然です。 自分でcursesをコンパイルした方が、遠回りなようでも結局早かったりしませんか? 私はMinGWの環境でcursesを使ったことはないので、そもそもちゃんとコンパイルできて動作するのかどうかは知りませんが...

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

MinGWをインストールしただけではcursesは入らないはずです。 cursesはどんな素性のものを入手したのでしょうか? その辺りに問題の原因がありませんか?

ma-0710
質問者

お礼

ありがとうございます。 おっしゃられる通り、MinGWをインストールしただけではcursesは入らなかったので、UNIX の curses.h を持って来たり、pdcurses-2.6-bin を入れたり、pdc34dllw を入れたりで、ヘッダとライブラリがめちゃくちゃになっている気がします。 すべて消して一からやり直してみます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

とりあえず ・どの curses.h を #include するのか ・それに対応するライブラリ libcurses.* はどこにあるのか を確認しては? curses は Unix 由来だから, #include している curses.h のあるディレクトリ付近をさがせば対応する libcurses.* が見付かりませんかね.

ma-0710
質問者

お礼

ありがとうございます。 curses.h の整理とライブラリ探しをやってみます。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.4

>それと、めちゃくちゃにインストールしたためか、curses.h がいくつもありどれを使えば良いかわからない状態です。(念の為すべて試してみましたが…) > >何かヘッダファイル以外に、「.a」や「.dll」など必要なファイルがあるのでしょうか? >具体的に何をどうすればよいのやら、さっぱりわからず、立ち往生です。 >何か他に心当たりがあるようでしたら、教えていただけないでしょうか。 #2の方はその心当たりをすでに書かれてると思いますが。 要は、ヘッダファイルとリンクしているライブラリの組み合わせがかみ合ってないんだから、ヘッダファイルとリンクするライブラリの組み合わせを適切にしてください。って事です。 ヘッダファイルとリンクするライブラリの適切な組み合わせは、さすがにめちゃめちゃな状態といわれている以上アドバイスできる人はいないでしょうからご自分で調べるしかないと思います。 またヘッダファイルにあるのは基本的に関数の宣言であって、関数の本体はライブラリ(*.aや*.dll)にありますからヘッダファイルだけあってもリンクや実行時にエラーになります。 あと大抵のヘッダファイルは自分が必要とするヘッダファイルは自分でインクルードするように書かれてる事が多いので前もってインクルードしておかなければならないということはあまりないです。

ma-0710
質問者

お礼

ありがとうございます。大変参考になります。 getyxを使用するには、curses.hがあれば良いと思いますので、一先ずヘッダーは置いといて、もう一度 curses のライブラリを見直ししてみます。

回答No.3

> 「The inclusion of <curses.h> may make visible all symbols from the headers <stdio.h>, <term.h>, <termios.h> and <wchar.h>. 」って書いてある。 「curses.h を #include すると<stdio.h>などモロモロに定義されたシンボルも見えちゃうかも」と言うてるのだから、 他のヘッダが暗黙裡に #include されるんでしょう。だから > curses.hをインクルードするには「その前にインクルードしておく必要のあるヘッダ」がいっぱいある。 コレは違うんじゃないかしら?

ma-0710
質問者

お礼

ありがとうございます。 ヘッダファイルに関しては、よく吟味してからインクロードするようにします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

ヘッダやライブラリが複数あったりすると「どれを #include してどれをリンクするのか」で混乱する可能性が考えられるのですが, その辺は大丈夫でしょうか? つまり, 例えば ・#include しているヘッダでは getyx が getcurx や getcury を使う ・リンクしているライブラリは (対応するヘッダが使うことを想定していないので) getcurx や getcury を提供していない というようなことになってると, 明らかに破たんしますよね.

ma-0710
質問者

補足

ご回答ありがとうございます。 確かに curses.h では、 getyx が getcurx や getcury を使うようになっています。 それと、めちゃくちゃにインストールしたためか、curses.h がいくつもありどれを使えば良いかわからない状態です。(念の為すべて試してみましたが…) 何かヘッダファイル以外に、「.a」や「.dll」など必要なファイルがあるのでしょうか? 具体的に何をどうすればよいのやら、さっぱりわからず、立ち往生です。 何か他に心当たりがあるようでしたら、教えていただけないでしょうか。 よろしくお願い致します。

回答No.1

http://pubs.opengroup.org/onlinepubs/7908799/xcurses/curses.h.html に「The inclusion of <curses.h> may make visible all symbols from the headers <stdio.h>, <term.h>, <termios.h> and <wchar.h>. 」って書いてある。 curses.hをインクルードするには「その前にインクルードしておく必要のあるヘッダ」がいっぱいある。 少なくとも、stdio.hとstdlib.hだけじゃ「何もしてないのと一緒」だから、絶対にコンパイルできない。 んで「前提となるヘッダ」もインクルードすると「そのヘッダをインクルードする為に、事前にインクルードしておくヘッダ」が雪ダルマ式に増えていって収集が付かなくなるから、覚悟しておくように。 経験から、コンパイルが通るようになるだけで2日は必要。さらに、リンクが通るようになるにはもう2日かかると思う。

ma-0710
質問者

お礼

早速のご回答ありがとうございます。 コツコツと頑張ってみます。

関連するQ&A

専門家に質問してみよう