Не могу скомпилировать с правкой в ​​OpenBSD

Я думаю, что я должен установить библиотеку editline (libedit?), Но где я могу получить ее для OpenBSD? Код прекрасно компилируется с PC-BSD, но с OpenBSD я получаю эту ошибку

implicit declaration of rl_bind_key

Это библиотека editline, которая не найдена. Я попытался поискать в Google, где найти его для OpenBSD, но он не был найден. Вы можете мне помочь? Заголовки, которые я использую

#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

Это оскорбительный код

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

Если я бегу locate editline затем он находит и я изменяю Makefile и получаю новую ошибку undefined reference to tgetnum что в соответствии с Google кажется, что я должен связать с ncursesбиблиотека. Теперь это компилируется. Новый Makefile является:

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

1 ответ

Решение

Проверьте где editline/readline.h можно найти (например, с locate).

Если это в /usr/local/includeвы, вероятно, должны добавить это к вашему CFLAGS в вашем Makefile;

CFLAGS := $(CFLAGS) -I/usr/local/include -pedantic -std=c99 -Wall -O3 -g -DVERSION=\"$(GIT_VERSION)\"
LDIRS = -L/usr/local/lib
LIBS = -ledit

SRCS= main.c errors.c util.c pipeline.c
OBJS= $(SRCS:.c=.o)

shell: $(OBJS)
    $(CC) $(LDIRS) -o shell $(OBJS) $(LIBS)
Другие вопросы по тегам