programing

editline/history.h 및 editline/readline.h를 찾을 수 없음/이미 설치된 개발자 도구로 컴파일하려고 할 때 macOS에서 작동함

yellowcard 2023. 10. 27. 21:50
반응형

editline/history.h 및 editline/readline.h를 찾을 수 없음/이미 설치된 개발자 도구로 컴파일하려고 할 때 macOS에서 작동함

저는 독자적인 LISP(http://www.buildyourownlisp.com/chapter4_interactive_prompt) 를 구축하기 위한 이 자습서를 작성하고 있는데, 어떤 이유에서인지 컴파일을 시도하면 다음과 같은 내용이 나옵니다.

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

macOS 개발자 도구를 설치했는데, brew는 readline이 설치되어 있고 brew install editline을 시도하면 어떻게 해야 할지 모르겠습니다.

이게 내 암호입니다.

  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 } 

분명 아주 기본적인 일이지만, 이 프로젝트를 꼭 진행하고 싶어서 해결할 수 있었으면 좋겠습니다.이것이 제가 컴파일할 때 사용하는 방법입니다.

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

포함만

#include <editline/readline.h>

명령줄 도구가 설치된 경우 이 도구가 존재해야 합니다.이 파일에는 히스토리 기능을 포함하여 libedit을 위한 "readline wrapper"가 포함되어 있습니다.포함파일<editline/history.h>OS X에 존재하지 않습니다.

그 수정으로 당신의 코드를 테스트해보니 문제없이 컴파일되어 실행되었습니다.

OSX 요세미티 사용.제거했습니다.#include<editline/history.h>

사용후cc -std=c99 -Wall test.c -ledit -o test

지금은 잘 작동합니다.

난 엘 캐피탄에 있어, 제거#include <editline/history.h>, 사용.cc -std=c99 -Wall test.c -ledit -o test저한테는 통합니다.
플래그 추가-ledit출력 플래드 이전에, 그것은 연결 과정이고, 컴파일러가 당신의 프로그램에 편집 라인에 직접 호출을 내장할 수 있게 해줍니다.그렇지 않으면 아래와 같은 오류 메시지가 나타납니다.

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

우분투 14.04에 있습니다.

시도해 보십시오.

sudo apt-get install libeditline-dev

다음을 포함합니다.

#include <editline.h>

최종적으로 다음과 같이 컴파일합니다.

더하다-leditline기중에

도움이 되었으면 좋겠습니다.

OSX 매버릭스를 사용하고 있는데 라인을 제거하는 것이 효과적이었습니다.

#include <editline/history.h>

FreeBSD에서 다음을 수행하는 솔루션(다른 Unice에서도 작동할 수 있음):

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

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

...

그리고 실행:

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

컴파일 단계에서 "-readline"이 없으면 링크되지 않으며 "readline" 함수에 대한 정의되지 않은 참조에 대한 오류가 발생합니다.

는 당신만의 목록을 만들기로 시작했고 같은 문제에 부딪쳤습니다.위의 어떤 답변도 저에게 통하지 않았습니다.약간의 연구 끝에 저는 macOs에 읽기 라인 기능을 제공하는 gnu 읽기 라인 라이브러리가 없다는 것을 알게 되었습니다. 다른 버전의 macOs는 편집 라인이라는 라이브러리를 사용하여 읽기 라인의 에뮬레이션을 제공합니다.시작은...

man editline

#include <histedit.h>

네, 편집 라인은 라인 입력과 이력에 대한 몇 가지 구조를 제공하고 그 구조에 대한 기능을 제공합니다.먼저 이러한 구조를 인스턴스화해야 합니다.편집 라인에 대한 설명서에는 예제가 없기 때문에 그다지 도움이 되지 않습니다.애플사는 헤더 파일을 사용할 수 있도록 하여 조금이나마 도움이 됩니다.http://www.opensource.apple.com/source/libedit/libedit-13/src/histedit.h

나는 이것이 처음이고 여전히 나에게 꽤 혼란스러웠습니다. 데비안 패키지로 사용할 수 있는 소스 코드의 일부 버전이 있습니다.다행히 나보다 현명한 사람이 이미 그것을 파고들어 lbedit을 사용하여 명령 줄을 구현했습니다.https://www.cs.utah.edu/ ~bigler/code/lived it. html.비글러 씨의 코드와 Build your our own list에서 코드를 가져와서 이것을 얻기 위해 조합했습니다.

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

주의: 사용되는 구조물의 인스턴스화는 while loop 외부에서 발생하며, 구조물이 사용하는 메모리를 자유롭게 해주는 기능도 마찬가지입니다.이 때문에 종료 명령을 추가했습니다. 그렇지 않으면 while loop을 종료할 수 있는 유일한 방법은 프로그램을 중단하는 것뿐이라면 메모리 누수가 있다고 생각합니다.컴파일 방법:

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

- 편집라인을 연결하기 위해 리드가 필요합니다.

관련성이 있다면, 저는 macOs 10.4.11을 사용하고 있고 여기 제 컴파일러, 출력이 있습니다.gcc --version

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

이 책은 c-code가 휴대용이어야 한다는 것과 그렇지 않다는 것을 지적합니다.다음 단계는 리눅스에서 읽기 라인을 사용하고 macos에서 편집 라인을 사용하도록 전처리 지시문을 추가하는 것입니다.

Debian Buster 10에서 패키지를 다음과 같이 설치해야 했습니다.

sudo apt install libeditline-dev 

대신:

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

방금 포함시켰습니다.

#include <editline.h>

-리드 라인 플래그로 프로그램을 실행하고 완벽하게 작동했습니다.

우분투에 있는 경우 편집 라인 라이브러리 추가sudo apt-get install libtedit-dev

언급URL : https://stackoverflow.com/questions/22886475/editline-history-h-and-editline-readline-h-not-found-working-on-macos-when-tryin

반응형