2013-01-19 32 views
25

私はUbuntu 12.04を使用しています。現在、C、OpenGL、ティーポット、および入力方法に関するプロジェクトに取り組んでいます。gcc/usr/bin/ld:エラー:-lncursesを見つけることができません。

問題は、矢印キーを入力として決定したときに始まりました。矢印キーのキーコードを確認するためにチェックしましたが、すべての矢印は0を返します。これをどのように動作させるかを調べたところ、conio.hが見つかりました。残念ながら、それはLinuxでは利用できない古いDOSヘッダです。それから私はncursesと呼ばれる代用品を見つけました。

ビルドの手順に沿って必要なライブラリをインストールした後、main.cソースに#curses.hを組み込みました。私は最初のgccを使用してコンパイルしようとしたとき、私は次のエラーを得た:

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 

しかし、私は別のエラーで迎えられた。

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を追加することで修正を見つけました:

/usr/bin/ld: error: cannot find -lncurses 

以前のエラーと同じです。

私は過去2日間、UbuntuフォーラムとStackOverFlowの両方を検索しました。どんな助けもありがとう。

P.S.これが重要である場合、私は知らないが、私が、/ usr/binに/ LDを実行しようとすると、私はこのエラーを取得:

ld: fatal error: no input files 
+20

'apt-getののlibncurses5-dev'をインストールしますか? – trojanfoe

+0

これらのコメントはなぜ小さくなければならないのですか?-0- 私は前にあなたのコメントが表示されませんでしたが、修正されました。なぜコンパイラが認識しなかった非公式版をインストールしたように見えますか?みんな、ありがとう! – Yrrej10

答えて

2

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

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

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

ncurses-staticをインストールしてくださいあなたのUbuntu OSにパッケージしかインストールされていない場合は、パッケージもあります。

これで問題が解決した場合、さらに、@ Joachimのコンパイル方法を追加すると、素晴らしいスタートになります。

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

リンカーは、その検索パスで共有ライブラリを見つけることができません。共有ライブラリがあるディレクトリをLD_LIBRARY_PATH環境変数に追加すると、リンカはそれを見つけてリンクすることができます。

gcc main.o -o main -lm -lGL -lGLU -lglut -lncurses 

をそして、それは罰金コンパイルする必要があります。その場合は、あなたは、GCCに-Lオプションを省略することができます。

編集: apt-get install libncurses5-devはあなたの問題を解決します。

FYI。 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 
+0

その他の問題はまだあります:/ 1. libncurses.so.5とlibncurses.so.5.9の両方が再割り当てされていません 2.どこでLD_LIBRARY_PATH変数が見つかりますか – Yrrej10

+0

あなたは '$ LD_LIBRARY_PATH';非標準ローダーパスを設定する必要がある場合は、 '/ etc/ld.so.conf.d'にファイルを作成してください。 – trojanfoe

+0

今私は混乱しています。私は/etc/ld.so.conf.dのファイルを見て、ncursesライブラリはそれらのディレクトリにあります: lib/i386-linux-gnuとusr/lib/i386-linux-gnu – Yrrej10

39

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

はUbuntuの上で、私は単純に走っ:

sudo apt-get install lib32ncurses5-dev 
+7

gnureadlineをインストールできませんでしたpip、python 2.7を介してこれが私の問題を解決しました。 – rioted

関連する問題