web-dev-qa-db-ja.com

gcc / usr / bin / ld:エラー:-lncursesが見つかりません

私は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
31
Yrrej10

私が同じ問題を抱えていた人にとっては、32ビットライブラリが欠落していました。 lib32ncurses5-devパッケージが欠落している64ビットサーバーで32ビットをコンパイルしていました。

Ubuntuでは、単に実行しました:

Sudo apt-get install lib32ncurses5-dev
46
Dale

まず最初に、リンク時にライブラリ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
1
askmish