2013-02-08 10 views
7

Ich habe ein Problem beim Versuch, die GNU Readline Bibliothek Beispielcode available in wikipedia ausführen. Hier geht es:undefined Verweis auf `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); 
    } 
} 

Ich bin auf einer eingeschränkten Umgebung arbeiten waren Readline- nicht verfügbar war, so hatte ich die Quellen herunterladen, kompilieren und installieren Sie es zu mir nach Hause Richt.

Das ist die Struktur in meinem Home-Verzeichnis:

.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 

Das Problem ist, wenn ich gcc nenne es wirft mir einen Fehler:

$ 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 

Es gibt eine Antwort über diese here, aber Ich verwende keine NetBeans und bin mir nicht sicher, wie ich den Pfad zur Bibliothek in der Befehlszeile angeben soll.

Ich habe versucht, den Linker zu sagen, wo die Bibliotheken sind, aber das Ergebnis ist immer noch das gleiche:

$ 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 

Irgendwelche Ideen, was ich hier vielleicht fehlt?

+1

Sie müssen die Bibliothek verknüpfen, so setzen '-lreadline' nahe Ende des' gcc' Befehl (und wahrscheinlich '-L. local/lib' vorher). Und um ein '* .o' aus einem' * .c' zu erhalten, benutze 'gcc -Wall -c -g Hallo.c -o Hallo.o' –

+1

benutze -ledit für readline und add_history – yet

Antwort

12

Sie benötigen againts die eigentliche Bibliothek verknüpfen mit -lreadline in gcc Argumente