33

私は Ubuntu 12.04 を実行しています。現在、C、OpenGL、ティーポット、および入力メソッドを含むプロジェクトに取り組んでいます。

問題は、矢印キーを入力として使用することにしたときに始まりました。矢印キーのキー コードを確認しましたが、すべての矢印が 0 を返しました。これを機能させる方法を調べたところ、conio.h が見つかりました。残念ながら、これは Linux では使用できない古い DOS ヘッダーです。次に、ncurses という代替品を見つけました。

必要なライブラリをインストールした後、ビルド手順に厳密に従って、main.c ソースに curses.h を #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 の両方を検索しました。どんな助けでも大歓迎です。

PS これが重要かどうかはわかりませんが、/usr/bin/ld を実行しようとすると、次のエラーが発生します。

ld: fatal error: no input files
4

3 に答える 3

49

私が持っていた同じ問題を抱えている人のために:32ビットライブラリがありませんでした。lib32ncurses5-dev パッケージがない 64 ビット サーバーで 32 ビットをコンパイルしていました。

Ubuntuでは、次のように実行しました:

sudo apt-get install lib32ncurses5-dev
于 2015-01-07T17:10:13.480 に答える
2

Ubuntu OSにパッケージncurses-staticのみがインストールされている場合は、パッケージもインストールしてみてください。ncurses-devel

それで問題が解決した場合、さらに@Joachimのコンパイル手順を追加した場合は、すばらしいスタートを切ることができます。

gcc main.o -o main -L/location/of/ncurses -lm -lGL -lGLU -lglut -lncurses

リンカは、検索パスで共有ライブラリを見つけることができません。共有ライブラリがあるディレクトリをLD_LIBRARY_PATH環境変数に追加すると、リンカはそれを見つけてリンクできるようになります。その場合-L、gccのオプションを省略できます。

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
于 2013-01-19T17:00:48.153 に答える
2

まず、リンクするときにオブジェクトファイルのにライブラリを配置する必要があります。そして、ソースファイルのコンパイルにはそれらをまったく含まないでください。

その後、ncursesが標準の検索フォルダーにインストールされていない場合は、リンカーがどこにあるかを示す必要があります。これは、-Lコマンドラインオプションを使用して実行されます。

gcc main.o -o main -L/location/of/ncurses -lm -lGL -lGLU -lglut -lncurses
于 2013-01-19T16:50:04.683 に答える