editline/history.h und editline/readline.h nicht gefunden/funktioniert unter macOS, wenn versucht wird, mit bereits installierten Entwicklertools zu kompilieren

Lesezeit: 6 Minuten

Benutzeravatar von yburyug
yburyug

Ich arbeite an diesem Tutorial zum Erstellen Ihres eigenen LISP (http://www.buildyourownlisp.com/chapter4_interactive_prompt) und aus irgendeinem Grund bekomme ich beim Kompilieren Folgendes:

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

Ich habe die macOS-Entwicklertools installiert und brew zeigt an, dass readline installiert ist, und es weiß nicht, was zu tun ist, wenn ich versuche, brew install editline zu installieren.

Das ist mein Code:

  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 } 

Es ist offensichtlich sehr einfach, aber ich möchte dieses Projekt wirklich ins Rollen bringen, also hoffe ich, dass ich das herausfinden kann. Dies ist, was ich zum Kompilieren verwende:

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

Nur einschließen

#include <editline/readline.h>

die vorhanden sein sollte, wenn die Befehlszeilentools installiert sind. Diese Datei enthält den “Readline-Wrapper” für libedit, einschließlich der History-Funktionen. Eine Include-Datei <editline/history.h> existiert nicht unter OS X.

Ich habe Ihren Code mit dieser Modifikation getestet, und er wurde ohne Probleme kompiliert und ausgeführt.

  • Habe es gerade laufen lassen. Schätze es wirklich! Ich bin ein C-Noob. Vielen Dank 🙂

    – yburyug

    5. April 2014 um 21:33 Uhr

  • Undefinierte Symbole für Architektur x86_64: „_add_history“, referenziert von: _main in prompt-OYsOTI.o „_readline“, referenziert von: _main in prompt-OYsOTI.o ld: Symbol(e) nicht gefunden für Architektur x86_64 clang: Fehler: Linker Befehl mit Exit-Code 1 fehlgeschlagen (verwenden Sie -v, um den Aufruf anzuzeigen)

    – Vinit Kumar

    6. April 2014 um 11:10 Uhr


  • @Vinit: Haben Sie “libedit.dylib” zu den Linkbibliotheken Ihres Projekts hinzugefügt? (Das ist, was die -ledit Option ist für in der Frage.)

    –Martin R

    6. April 2014 um 11:19 Uhr

  • Nein, habe ich nicht. Ich habe das gleiche Beispiel wie in der Frage verwendet. Als ich kompilierte, gab es den folgenden Fehler.

    – Vinit Kumar

    6. April 2014 um 13:32 Uhr

  • @Vinit Sie sollten verwenden cc -std=c99 -Wall test.c -ledit -o testbeachten Sie, dass führte.

    – Allen

    27. Mai 2015 um 9:19 Uhr

Mit OSX Yosemite. Ich entfernte #include<editline/history.h>

und dann verwendet cc -std=c99 -Wall test.c -ledit -o test

Funktioniert jetzt gut

Benutzeravatar von Rachel
Rachel

Ich bin auf El Capitan, entfernen #include <editline/history.h>und verwenden cc -std=c99 -Wall test.c -ledit -o test funktioniert bei mir.

Fügen Sie die Flagge hinzu -ledit vor dem Ausgabeflad ist es ein Verknüpfungsprozess, der es dem Compiler ermöglicht, Aufrufe von editline direkt in Ihr Programm einzubetten. Oder Sie erhalten die folgende Fehlermeldung,

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

Ich bin auf Ubuntu 14.04.

Versuche dies:

sudo apt-get install libeditline-dev

und so einfügen:

#include <editline.h>

schließlich so kompilieren:

hinzufügen -leditline in der Flagge

Ich hoffe, das kann helfen.

Benutzeravatar von copio
Kopie

Ich bin auf OSX Mavericks und das Entfernen der Zeile hat für mich funktioniert:

#include <editline/history.h>

Benutzeravatar von cmaceachern
cmaceachern

Die Lösung für diejenigen, die auf FreeBSD folgen (funktioniert möglicherweise auch auf anderen Unices):

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

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

...

Und Renn:

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

Ohne “-lreadline” im Kompilierungsschritt wird es nicht eingebunden und Sie erhalten Fehler über undefinierte Verweise auf die “readline”-Funktion.

Benutzeravatar von biketortoise
Fahrradschildkröte

Ich fing an Erstellen Sie Ihre eigene Liste und bin auf das gleiche Problem gestoßen. Keine der obigen Antworten hat bei mir funktioniert. Nach ein wenig Recherche fand ich heraus, dass macOs nicht über die gnu readline-Bibliothek verfügt, die die readline-Funktionen bereitstellt. Verschiedene Versionen von MacOs bieten eine Emulation von readline mithilfe einer Bibliothek namens editline. beginnen…

man editline

#include <histedit.h>

Ok, editline gibt Ihnen einige Strukturen für die Zeileneingabe und den Verlauf und Funktionen, um damit zu arbeiten. Zuerst müssen Sie diese Strukturen instanziieren. Die Dokumentation zu editline ist nicht sehr hilfreich, da sie keine Beispiele enthält. Apple stellt die Header-Datei zur Verfügung, das hilft ein wenig. http://www.opensource.apple.com/source/libedit/libedit-13/src/histedit.h

Ich bin neu dabei und es war immer noch ziemlich verwirrend für mich. Es gibt eine Version des Quellcodes für libedit, die als Debian-Paket verfügbar ist. Glücklicherweise hat sich jemand, der klüger ist als ich, bereits damit beschäftigt und eine Befehlszeile mit lbedit implementiert. Sein Code ist hier: https://www.cs.utah.edu/~bigler/code/libedit.html. Ich nahm Herrn Biglers Code und den Code von Erstellen Sie Ihre eigene Listeund fügen Sie sie zusammen, um dies zu erhalten.

/* 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;
}

Hinweis: Die Instanziierung der verwendeten Strukturen erfolgt außerhalb der While-Schleife, ebenso wie die Funktionen, die den von diesen Strukturen verwendeten Speicher freigeben. Aus diesem Grund habe ich den Befehl zum Beenden hinzugefügt, andernfalls denke ich, dass es ein Speicherleck gibt, wenn die einzige Möglichkeit, die While-Schleife zu beenden, darin besteht, das Programm zu unterbrechen. Kompilieren:

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

-ledit wird benötigt, um editline zu verknüpfen

Wenn es relevant ist, verwende ich macOs 10.4.11 und hier ist mein Compiler, Ausgabe von
gcc --version

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

Das einzige Problem dabei, und das Buch weist darauf hin, ist, dass C-Code portabel sein soll und dies nicht der Fall ist. Der nächste Schritt wäre, Präprozessor-Direktiven hinzuzufügen, damit es readline unter Linux und editline unter Macos verwendet.

  • danke dafür, auf High Sierra funktionieren die anderen Lösungen nicht. auch Frage … Ich weiß, dass es wahrscheinlich eine schlechte Praxis ist, aber löscht das Betriebssystem nicht den Speicher, wenn der Prozess beendet wird? dh sind Speicherlecks nicht nur dann ein Problem, wenn sie während der laufenden Ausführung auftreten?

    – James Katze

    13. November 2018 um 16:02 Uhr

1387310cookie-checkeditline/history.h und editline/readline.h nicht gefunden/funktioniert unter macOS, wenn versucht wird, mit bereits installierten Entwicklertools zu kompilieren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy