2013-02-08 23 views
7

Mam problem z próbą uruchomienia kodu biblioteki przykładowy kod available in wikipedia. Tu idzie:niezdefiniowane odwołanie do `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); 
    } 
} 

pracuję w ograniczonym środowisku były readline nie był dostępny, więc musiałem ściągnąć źródła, skompilować i zainstalować go do mojego domu reż.

Jest to struktura w moim katalogu domowym:

.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 

Problem jest, gdy zgłoszę gcc to wyrzuca mi błąd:

$ 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 

jest odpowiedź o tym here, ale Nie używam Netbeans i nie jestem pewien, jak określić ścieżkę do biblioteki w wierszu poleceń.

próbowałem powiedzieć linker gdzie biblioteki, ale wynik jest wciąż ten sam:

$ 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 

pomysłów co mogę być tu brakuje?

+1

Trzeba połączyć bibliotekę, więc umieścić '-lreadline' zbliża się do końca swojej poleceniem' gcc' (i prawdopodobnie '-l. local/lib' before). Aby uzyskać '* .o' z' * .c' użyj 'gcc -Wall -c -g hello.c -o hello.o' –

+1

użyj -ledit do readline i add_history – yet

Odpowiedz

12

Trzeba połączyć againts rzeczywistej biblioteki przy użyciu -lreadline w gcc argumentów

Powiązane problemy