プロが教えるわが家の防犯対策術!

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 へはパスも通っており、リンクできているようなんですが、
エラーが出てしまいます。

どうすれば良いのかわからず、大変困っています。
だれかご存知の方、教えてください。
どうかよろしくお願い致します。

A 回答 (7件)

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



素性がはっきりしていて、かつMinGWに適合するバイナリが入手できたのであればよいのですが、そうでなければうまくいかなくて当然です。
自分でcursesをコンパイルした方が、遠回りなようでも結局早かったりしませんか?

私はMinGWの環境でcursesを使ったことはないので、そもそもちゃんとコンパイルできて動作するのかどうかは知りませんが...
    • good
    • 0

MinGWをインストールしただけではcursesは入らないはずです。


cursesはどんな素性のものを入手したのでしょうか?
その辺りに問題の原因がありませんか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/02/20 10:45

とりあえず


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

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

お礼日時:2013/02/20 10:36

>それと、めちゃくちゃにインストールしたためか、curses.h がいくつもありどれを使えば良いかわからない状態です。

(念の為すべて試してみましたが…)
>
>何かヘッダファイル以外に、「.a」や「.dll」など必要なファイルがあるのでしょうか?
>具体的に何をどうすればよいのやら、さっぱりわからず、立ち往生です。
>何か他に心当たりがあるようでしたら、教えていただけないでしょうか。

#2の方はその心当たりをすでに書かれてると思いますが。
要は、ヘッダファイルとリンクしているライブラリの組み合わせがかみ合ってないんだから、ヘッダファイルとリンクするライブラリの組み合わせを適切にしてください。って事です。
ヘッダファイルとリンクするライブラリの適切な組み合わせは、さすがにめちゃめちゃな状態といわれている以上アドバイスできる人はいないでしょうからご自分で調べるしかないと思います。

またヘッダファイルにあるのは基本的に関数の宣言であって、関数の本体はライブラリ(*.aや*.dll)にありますからヘッダファイルだけあってもリンクや実行時にエラーになります。

あと大抵のヘッダファイルは自分が必要とするヘッダファイルは自分でインクルードするように書かれてる事が多いので前もってインクルードしておかなければならないということはあまりないです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/02/20 10:32

> 「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をインクルードするには「その前にインクルードしておく必要のあるヘッダ」がいっぱいある。

コレは違うんじゃないかしら?
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/02/20 08:22

ヘッダやライブラリが複数あったりすると「どれを #include してどれをリンクするのか」で混乱する可能性が考えられるのですが, その辺は大丈夫でしょうか? つまり, 例えば


・#include しているヘッダでは getyx が getcurx や getcury を使う
・リンクしているライブラリは (対応するヘッダが使うことを想定していないので) getcurx や getcury を提供していない
というようなことになってると, 明らかに破たんしますよね.

この回答への補足

ご回答ありがとうございます。
確かに curses.h では、 getyx が getcurx や getcury を使うようになっています。
それと、めちゃくちゃにインストールしたためか、curses.h がいくつもありどれを使えば良いかわからない状態です。(念の為すべて試してみましたが…)

何かヘッダファイル以外に、「.a」や「.dll」など必要なファイルがあるのでしょうか?
具体的に何をどうすればよいのやら、さっぱりわからず、立ち往生です。
何か他に心当たりがあるようでしたら、教えていただけないでしょうか。
よろしくお願い致します。

補足日時:2013/02/19 18:59
    • good
    • 0

http://pubs.opengroup.org/onlinepubs/7908799/xcu …

に「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日かかると思う。
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/02/19 18:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!