2014-04-05 5 views
21

Sto lavorando a questo tutorial sulla creazione del proprio LISP (http://www.buildyourownlisp.com/chapter4_interactive_prompt) e per qualche motivo quando provo per compilare ottengo questo:editline/history.h e editline/readline.h non trovato/funzionante su OSX quando si tenta di compilare con gli strumenti di sviluppo installati già

REPL.c:4:10: fatal error: 'editline/readline.h' file not found 
#include <editline/history.h> 
^ 
1 error generated. 

ho installato gli strumenti di osx sviluppatori e birra sta mostrando è installato readline e non sa cosa fare quando provo birra installare esiste EDITLINE.

Questo è il mio codice:

1 #include <stdio.h> 
    2 #include <stdlib.h> 
    3 #include <editline/readline.h> 
    4 #include <editline/history.h> 
    5 
    6 int main(int argc, char** argv) { 
    7  
    8 /* version/exit info */ 
    9 puts("Edward Version 0.0.1"); 
10 puts("Press Ctrl+c to Exit\n"); 
11   
12 /* endless loop for main REPL */ 
13 while (1) { 
14  /* output prompt and read line */ 
15  char* input = readline("lispy> "); 
16     
17  /* put input in history */ 
18  add_history(input); 
19      
20  /* Echo input back */       
21  printf("No you're a %s\n", input); 
22      
23  /* free input */ 
24  free(input); 
25 }       
26 return 0; 
27 } 

Ovviamente è molto semplice, ma voglio davvero ottenere questo progetto a rotazione in modo da sto sperando che posso calcolare questo fuori. Questo è quello che sto usando per compilare:

cc -std=c99 -Wall REPL.c -ledit -o REPL 

risposta

24

Includi solo

#include <editline/readline.h> 

che dovrebbe esistere se sono installati gli strumenti della riga di comando. Questo file contiene il "readlin wrapper" per libedit, incluse le funzioni di cronologia. Un file di inclusione <editline/history.h> non esiste su OS X.

Ho testato il codice con tale modifica, e ha compilato e eseguito senza problemi.

+0

Appena eseguito. Lo apprezzo davvero! Sono un C noob. Grazie :) – yburyug

+1

Simboli indefiniti per architettura x86_64: "_add_history", referenziato da: _main in prompt-OYsOTI.o "_readline", riferito da: _main in pronta-OYsOTI.o ld: simbolo (s) non trovate in x86_64 clang: errore: comando linker non riuscita con codice di uscita 1 (uso -v per vedere invocazione) –

+5

@Vinit: hai aggiunto "libedit.dylib" alle librerie di link del tuo progetto? (Questo è ciò che l'opzione '-ledit' è nella domanda.) –

2

Sono su OSX Mavericks e rimuovendo la linea funzionato per me:

#include <editline/history.h> 
3

Sono su Ubuntu 14.04.

provare questo:

sudo apt-get install libeditline-dev

e comprendono in questo modo:

#include <editline.h>

finalmente compilare in questo modo:

aggiungere -leditline nella bandiera

Spero che questo possa aiutare.

+3

Il pacchetto corretto per 'editline/history.h' sembra essere' libedit-dev'. – JAB

4

Utilizzo di OSX Yosemite. Ho rimosso #include<editline/history.h>

e quindi utilizzato cc -std=c99 -Wall test.c -ledit -o test

funziona bene ora

1

Sono su EI Capitan, Rimuovere #include <editline/history.h>, e utilizzare cc -std=c99 -Wall test.c -ledit -o test lavori per me.
Aggiungere la bandiera -ledit prima dell'output, è un processo di collegamento, consente al compilatore di incorporare direttamente le chiamate a editline nel programma.Oppure, si otterrà il seguente messaggio di errore,

Undefined symbols for architecture x86_64: 
    "_add_history", referenced from: 
     _main in prompt-086f90.o 
    "_readline", referenced from: 
     _main in prompt-086f90.o 
ld: symbol(s) not found for architecture x86_64 
0

La soluzione per coloro che seguono insieme su FreeBSD (potrebbe funzionare su altri Unix pure):

#include <stdio.h> 
#include <stdlib.h> 

#include <readline/readline.h> 
#include <readline/history.h> 

... 

ed eseguire:

$ cc test.c -Wall -std=c99 -lreadline -o test 

Senza "-lreadline" nel passo di compilazione non è collegato e si otterranno errori relativi al riferimento non definito alla funzione "readline".

0

Ho iniziato su Crea la tua lista e ho riscontrato lo stesso problema. Nessuna delle risposte di cui sopra ha funzionato per me. Dopo una piccola ricerca, ho scoperto che macOs non ha la libreria readline di gnu che fornisce le funzioni readline. Diverse versioni di MacO forniscono emulazione di readline usando una libreria chiamata editline. per cominciare ...

man editline

#include <histedit.h>

Ok, esiste EDITLINE vi dà alcuni le strutture per ingresso di linea e la storia, e funzioni per operare su di essi. Per prima cosa devi istanziare queste strutture. La documentazione per editline non è molto utile perché non contiene alcun esempio. Apple rende disponibile il file di intestazione in modo da aiutare un po '. http://www.opensource.apple.com/source/libedit/libedit-13/src/histedit.h

Sono nuovo di questo ed è stato ancora piuttosto confusionario per me. c'è una versione del codice sorgente per libedit disponibile come pacchetto debian. Fortunatamente qualcuno più saggio di me lo ha già scavato e ha implementato una riga di comando usando lbedit. Il suo codice è qui: https://www.cs.utah.edu/~bigler/code/libedit.html. Ho preso il codice di Mr Bigler e il codice da Crea il tuo elenco e li metto insieme per ottenere questo.

/* repl-macos.c 
* Repl code example from builyourownlisp.com 
* Modified by NB aug 2017 
* Code example for editline from 
* www.cs.utah.edu/~bigler/code/libedit.html 
*/ 

#include <stdio.h> 
#include <string.h> 
#include <histedit.h> 

char* prompt(EditLine *e){ 
return "lispy> "; 
} 

int main(int argc, char** argv){ 

    EditLine *el; // Line editor state 
    History *herstory; // the rest is history 

    // Temp Variables 
    int count; 
    const char *usrin; 
    int keepreading = 1; 
    HistEvent ev; 

    // Initialize the editline state 
    el = el_init(argv[0], stdin, stdout, stderr); 
    el_set(el, EL_PROMPT, &prompt); 
    el_set(el, EL_EDITOR, "emacs"); 

    // Initialize history 
    herstory = history_init(); 
    if(!herstory){ 
     fprintf(stderr, "Couldn't initialize history\n"); 
     return 1; 
    } 

    //set history size 
    history(herstory, &ev, H_SETSIZE, 800); 
    // Set up the call back functions for history functionality 
    el_set(el, EL_HIST, history, herstory); 

    puts("Begin moLisp interpreter"); 
    puts("Type 'exit' at prompt to exit"); 

    while(keepreading){ 
     usrin = el_gets(el, &count); 

    // add the command to the history, and echo it back to the user 
     if(count > 0){ 
      history(herstory, &ev, H_ENTER, usrin); 
      if(strcmp(usrin, "exit\n")) 
       printf("No, You're a %s", usrin); 
      else{ 
       puts("bye"); 
       --keepreading; 
      } 
     } 
    } 

    // Clean up memory 
    // by freeing the memory pointed to within the structs that 
    // libedit has created. 
    history_end(herstory); 
    el_end(el); 


    return 0; 
} 

Avviso: L'istanziazione dei struct che vengono utilizzati avviene al di fuori del ciclo while, e così fanno le funzioni che liberano la memoria tali structs utilizzano. Per questo motivo, ho aggiunto il comando per uscire, altrimenti penso che ci sia una perdita di memoria se l'unico modo per uscire dal ciclo while è interrompere il programma. Per compilare:

gcc repl-macos.c -ledit -Wall -o repl-edit

-ledit è necessaria per collegare esiste EDITLINE

Se ha alcuna rilevanza, sto usando MacOs 10.4.11 ed ecco il mio compilatore, uscita di gcc --version

powerpc-apple-darwin8-gcc-4.0.0 (GCC) 4.0.0 20041026 (Apple Computer, Inc. build 4061)

Ora l'unico problema con questo e il libro lo fa notare, è che il codice C dovrebbe essere portatile e questo non lo è. Il prossimo passo sarebbe aggiungere le direttive del preprocessore in modo che utilizzi readline su linux e editline su macos.

Problemi correlati