2013-02-08 9 views
7

GNU Readline kitaplık örnek kodunu çalıştırmaya çalışırken sorun yaşıyorum available in wikipedia. İşte geliyor: Ben kısıtlı bir ortamda çalışıyorum"readline" tanımına atıfta bulunulmamış başvuru

#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); 
    } 
} 

mevcut taleb değildi, bu yüzden ben, kaynaklar indir, derle ve benim ev dizinine yüklemek zorunda kaldı.

Bu

benim ev dizini altındaki yapısı şöyledir:

.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 

Sorun, gcc çağırdığınızda onu bana bir hata atar:

$ 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 

Orada bu here hakkında bir cevaptır, ancak Netbeans kullanmıyorum ve komut satırındaki kütüphaneye giden yolu nasıl belirleyeceğime emin değilim.

Ben kütüphaneler vardır bağlayıcı anlatmaya çalıştım ama sonuç yine aynıdır: Ben burada ne

$ 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 

Herhangi fikirleri eksik olabilir?

+1

yılında -lreadline kullanarak gerçek kütüphaneye Againts bağlamanız gerekir. önce yerel/lib '. Ve bir '* .o'dan' '.c' kullanmak için' gcc -Wall -c -g merhaba.c -o merhaba.o' –

+1

readline ve add_history için kullanın – yet

cevap

12

Sen nedenle `gcc` komutu (ve muhtemelen` L sonuna yakın `-lreadline` koymak, gcc argümanlar

Kütüphaneyi bağlamanız gerekir