2013-02-08 33 views
7

GNU Readlineライブラリのサンプルコードavailable in wikipediaを実行しようとして問題が発生しました。ここではそれが行く:私は制限された環境で働いている`readline 'への未定義の参照

#include <stdlib.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <readline/readline.h> 
#include <readline/history.h> 

int main() 
{ 
    char* input, shell_prompt[100]; 

    // Configure readline to auto-complete paths when the tab key is hit. 
    rl_bind_key('\t', rl_complete); 

    for(;;) { 
     // Create prompt string from user name and current working directory. 
     snprintf(shell_prompt, sizeof(shell_prompt), "%s:%s $ ", getenv("USER"), getcwd(NULL, 1024)); 

     // Display prompt and read input (n.b. input must be freed after use)... 
     input = readline(shell_prompt); 

     // Check for EOF. 
     if (!input) 
      break; 

     // Add input to history. 
     add_history(input); 

     // Do stuff... 

     // Free input. 
     free(input); 
    } 
} 

利用できreadlineのではなかったでしたので、私は、ソースをダウンロードし、それをコンパイルし、自分のホームディレクトリにインストールする必要がありました。

これは私のホームディレクトリの内部構造です:問題は、私はGCCを呼び出すとき、それは私にエラーをスローし、ある

.local 
├── include 
│   └── readline 
│      ├── chardefs.h 
│      ├── history.h 
│      ├── keymaps.h 
│      ├── readline.h 
│      ├── rlconf.h 
│      ├── rlstdc.h 
│      ├── rltypedefs.h 
│      └── tilde.h 
└── lib 
   ├── libhistory.a 
   ├── libhistory.so -> libhistory.so.6 
   ├── libhistory.so.6 -> libhistory.so.6.2 
   ├── libhistory.so.6.2 
      ├── libreadline.a 
   ├── libreadline.so -> libreadline.so.6 
   ├── libreadline.so.6 -> libreadline.so.6.2 
   └── libreadline.so.6.2 

$ gcc hello.c -o hello_c.o -I /home/my-home-dir/.local/include 
/tmp/cckC236E.o: In function `main': 
hello.c:(.text+0xa): undefined reference to `rl_complete' 
hello.c:(.text+0x14): undefined reference to `rl_bind_key' 
hello.c:(.text+0x60): undefined reference to `readline' 
hello.c:(.text+0x77): undefined reference to `add_history' 
collect2: error: ld returned 1 exit status 

このhereについての答えがありますが、私はNetbeansを使用していないので、コマンドラインでライブラリへのパスを指定する方法はあまりよく分かりません。

私は図書館があり、リンカを教えしようとしましたが、結果は同じです:

$ gcc hello.c -o hello_c.o -I /home/my-home-dir/.local/include -Xlinker "-L /home/my-home-dir/.local/lib" 
/tmp/cceiePMr.o: In function `main': 
hello.c:(.text+0xa): undefined reference to `rl_complete' 
hello.c:(.text+0x14): undefined reference to `rl_bind_key' 
hello.c:(.text+0x60): undefined reference to `readline' 
hello.c:(.text+0x77): undefined reference to `add_history' 
collect2: error: ld returned 1 exit status 

任意のアイデア私がここに存在しない可能性がありますでしょうか?

+1

を使用して実際のライブラリagaintsリンクする必要があります。ローカル/ lib'前)。 gcc -Wall -c -g hello.c -o hello.oを使用します。 –

+1

readlineとadd_historyに-leditを使用します。 – yet

答えて

12

あなたは、ライブラリをリンクするので、あなたの `gcc`コマンド(そしておそらく` -Lの終わり近く `-lreadline`を配置する必要がありgccの引数で-lreadline

関連する問題