editline/history.h und editline/readline.h nicht gefunden/funktioniert unter macOS, wenn versucht wird, mit bereits installierten Entwicklertools zu kompilieren
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
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.
Kopie
Ich bin auf OSX Mavericks und das Entfernen der Zeile hat für mich funktioniert:
#include <editline/history.h>
cmaceachern
Die Lösung für diejenigen, die auf FreeBSD folgen (funktioniert möglicherweise auch auf anderen Unices):
Ohne “-lreadline” im Kompilierungsschritt wird es nicht eingebunden und Sie erhalten Fehler über undefinierte Verweise auf die “readline”-Funktion.
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
13873100cookie-checkeditline/history.h und editline/readline.h nicht gefunden/funktioniert unter macOS, wenn versucht wird, mit bereits installierten Entwicklertools zu kompilierenyes