私はUbuntu 12.04を実行しています。現在、C、OpenGL、ティーポット、入力メソッドを含むプロジェクトに取り組んでいます。
この問題は、入力として矢印キーを使用することに決めたときに始まりました。矢印キーのキーコードを確認しましたが、すべての矢印が0を返します。これを機能させる方法を調べたところ、conio.hが見つかりました。残念ながら、これはLinuxでは利用できない古いDOSヘッダーです。それから、ncursesと呼ばれる代替を見つけました。
必要なライブラリをインストールした後、ビルド手順に厳密に従うことにより、curses.hをmain.cソースに#includeしました。 gccを使用して最初にコンパイルしようとしたときに、次のエラーが発生しました。
main.o:main.c:function _Key: error: undefined reference to 'stdscr'
main.o:main.c:function _Key: error: undefined reference to 'wgetch'
main.o:main.c:function _Key: error: undefined reference to 'stdscr'
main.o:main.c:function _Key: error: undefined reference to 'wgetch'
メイクファイルに-lncursesを次のように追加することで修正を見つけました。
SOURCES=main.c
main: main.o
gcc -lm -lGL -lGLU -lglut -lncurses main.o -o main
main.o: main.c
gcc -lm -lGL -lGLU -lglut -c main.c
しかし、私は別のエラーに迎えられました。
/usr/bin/ld: error: cannot find -lncurses
以前のエラーと同様に。
過去2日間、UbuntuフォーラムとStackOverFlowの両方を検索しました。任意の助けをいただければ幸いです。
追伸これが重要かどうかはわかりませんが、/ usr/bin/ldを実行しようとすると、次のエラーが表示されます。
ld: fatal error: no input files
私が同じ問題を抱えていた人にとっては、32ビットライブラリが欠落していました。 lib32ncurses5-devパッケージが欠落している64ビットサーバーで32ビットをコンパイルしていました。
Ubuntuでは、単に実行しました:
Sudo apt-get install lib32ncurses5-dev
まず最初に、リンク時にライブラリafterオブジェクトファイルを配置する必要があります。そして、ソースファイルのコンパイルにそれらを一切持たないでください。
その後、ncursesが標準の検索フォルダーにインストールされていない場合、それが存在するリンカーを指定する必要があります。これは-L
コマンドラインオプション:
gcc main.o -o main -L/location/of/ncurses -lm -lGL -lGLU -lglut -lncurses
Ubuntu OSにncurses-static
パッケージのみがインストールされている場合は、ncurses-devel
パッケージもインストールしてください。
それで問題が解決し、さらに@Joachimのコンパイル手順を追加すれば、素晴らしいスタートを切ることができます。
gcc main.o -o main -L/location/of/ncurses -lm -lGL -lGLU -lglut -lncurses
リンカは、検索パスで共有ライブラリを見つけることができません。共有ライブラリがあるディレクトリをLD_LIBRARY_PATH
環境変数に追加すると、リンカーはそれを見つけてリンクできるはずです。その場合、gccの-L
オプションを省略できます。
gcc main.o -o main -lm -lGL -lGLU -lglut -lncurses
そして、それはうまくコンパイルするはずです。
編集:apt-get install libncurses5-dev
が問題を修正することを知っておくと良いでしょう。
ご参考までに。 LD_LIBRARY_PATH
環境変数には、実行時にライブラリの依存関係を解決するためにリンカが使用するパスのコロン区切りリストが含まれます。これらのパスは、標準ライブラリパス/lib
および/usr/lib
よりも優先されます。標準パスは引き続き検索されますが、LD_LIBRARY_PATH
のパスのリストがすべて使用された後にのみ検索されます。
LD_LIBRARY_PATH
を使用する最良の方法は、プログラムを実行する直前にコマンドラインまたはスクリプトで設定することです。この方法で、新しいLD_LIBRARY_PATH
をシステムの残りの部分から隔離したままにすることができます。つまり、現在実行中のシェルのインスタンスに対してローカルです。
$ export LD_LIBRARY_PATH="/path/to/libncurses/library/directory/:$LD_LIBRARY_PATH"
$ gcc main.o -o main -lm -lGL -lGLU -lglut -lncurses