Ich denke, dass ich die Bibliothek editline (libedit?) Installieren muss, aber wo bekomme ich es für OpenBSD? Der Code kompiliert mit PC-BSD in Ordnung, aber mit OpenBSD bekomme ich diesen FehlerKann nicht mit editline unter OpenBSD kompilieren
implicit declaration of rl_bind_key
Es ist die editline Bibliothek, die nicht gefunden wird. Ich habe versucht zu googeln, wo es für OpenBSD zu finden ist, aber es wurde nicht gefunden. Kannst du mir helfen? Die Header ich verwende, sind
#define _XOPEN_SOURCE 500
#include <sys/stat.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/wait.h>
#include "openshell.h"
#include "errors.h"
#include <errno.h>
#include <locale.h>
#include <editline/readline.h>
Makefile
CC = gcc
GIT_VERSION := $(shell git describe --abbrev=4 --dirty --always --tags)
CFLAGS := $(CFLAGS) -pedantic -std=c99 -Wall -O3 -ledit -g -DVERSION=\"$(GIT_VERSION)\"
shell: main.o
$(CC) -o shell main.o errors.c util.c pipeline.c -ledit
main.o: main.c errors.c util.c
.PHONY: clean
clean:
rm -f *.o
Dies ist der säumige Code
int exec_program(const char *name) {
FILE *fp;
int r = 0;
char *input, shell_prompt[100];
if (sourceCount >= MAX_SOURCE) {
fprintf(stderr, "Too many source files\n");
return 1;
}
fp = stdin;
if (name) {
fp = fopen(name, "r");
if (fp == NULL) {
perror(name);
return 1;
}
}
sourcefiles[sourceCount++] = fp;
setlocale(LC_CTYPE, "");
/*Configure readline to auto-complete paths when the tab key is hit.*/
rl_bind_key('\t', rl_complete);
stifle_history(7);
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 (NB: input must be freed after use)...
input = readline(shell_prompt);
// Check for EOF.
if (!input)
break;
add_history(input);
r = command(input);
free(input);
}
return r;
}
Wenn ich locate editline
laufen dann findet es und ich das Makefile ändern und einen neuen Fehler erhalten undefined reference to tgetnum
dass nach google scheint wie muss ich mit der ncurses
library verknüpfen. Jetzt kompiliert es. Die neue Makefile
ist:
CC = gcc
GIT_VERSION := $(shell git describe --abbrev=4 --dirty --always --tags)
CFLAGS := $(CFLAGS) -L/usr/local/include/ -L/usr/include -pedantic -std=c99 -Wall -O3 -g -DVERSION=\"$(GIT_VERSION)\" -ledit -lncurses
LDIRS = -L/usr/local/lib -L/usr/lib
LIBS = -ledit lncurses -lcurses
shell: main.o
$(CC) -o shell main.o errors.c util.c pipeline.c -ledit -lncurses -lcurses
main.o: main.c errors.c util.c
.PHONY: clean
clean:
rm -f *.o
zeigen die Zusammenstellung Befehl (vielleicht durch 'make' getan) –
Verwandte Frage: http://stackoverflow.com/q/22886475/562459 –