2014-04-05 5 views
21

मैं अपने स्वयं के LISP (http://www.buildyourownlisp.com/chapter4_interactive_prompt) बनाने पर इस ट्यूटोरियल पर काम कर रहा हूं और किसी कारण से मैं कोशिश करता हूं संकलित करने के लिए मैं इस मिल:एडिटलाइन/history.h और एडिटलाइन/readline.h डेवलपर टूल्स के साथ संकलित करने की कोशिश करते समय ओएसएक्स पर नहीं मिला/काम कर रहा है

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

मैं OSX डेवलपर उपकरण स्थापित किया है और काढ़ा दिखा रहा है ReadLine स्थापित किया गया है और यह पता नहीं है जब मैं काढ़ा 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 

उत्तर

24

केवल

#include <editline/readline.h> 

जो कमांड लाइन उपकरण स्थापित कर रहे हैं, तो मौजूद होना चाहिए शामिल करें। इस फ़ाइल में libedit के लिए "रीडलाइन रैपर" शामिल है, जिसमें इतिहास फ़ंक्शन भी शामिल हैं। एक फ़ाइल <editline/history.h> ओएस एक्स

मुझे लगता है कि संशोधन के साथ अपने कोड का परीक्षण पर मौजूद नहीं है शामिल हैं, और यह संकलित और समस्याओं के बिना भाग गया।

+0

बस इसे चलाया। मैं इसकी प्रशंसा करता हूँ! मैं एक सी नोब हूँ। धन्यवाद :) – yburyug

+1

आर्किटेक्चर x86_64: "_add_history" के लिए अनिर्धारित प्रतीक, संदर्भित: _main प्रॉम्प्ट-ओवाईएसओटीआई में।ओ "_readline", से संदर्भित: में _main शीघ्र-OYsOTI.o ld: प्रतीक (रों) वास्तुकला x86_64 बजना के लिए नहीं मिला: त्रुटि: लिंकर आदेश से बाहर निकलें कोड 1 के साथ विफल (उपयोग -v मंगलाचरण देखने के लिए) –

+5

@ विनीट: क्या आपने अपनी परियोजना के लिंक पुस्तकालयों में "libedit.dylib" जोड़ा था? (प्रश्न में '-ledit' विकल्प यही है।) –

2

मैं पर OSX मावेरिक्स हूँ और लाइन को हटाने के लिए मेरे लिए काम किया:

#include <editline/history.h> 
3

मैं Ubuntu 14.04 पर हूँ।

इस प्रयास करें:

sudo apt-get install libeditline-dev

और शामिल इस तरह:

#include <editline.h>

अंत में इस तरह संकलन:

ध्वज में -leditline जोड़ने

मुझे उम्मीद है कि यह मदद कर सकता है।

+3

'संपादन/इतिहास.h' के लिए उचित पैकेज' libedit-dev' प्रतीत होता है। – JAB

4

ओएसएक्स योसेमेट का उपयोग करना। मैं #include<editline/history.h>

हटा दिया और फिर इस्तेमाल किया cc -std=c99 -Wall test.c -ledit -o test

वर्क्स ठीक अब

1

मैं ईआई कैपिटन पर हूँ, #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 
0

FreeBSD पर साथ निम्नलिखित लोगों के लिए समाधान (साथ ही साथ अन्य Unices पर काम कर सकते हैं):

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

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

... 

और चलाएँ:

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

संकलन चरण में "-लाइनलाइन" के बिना यह लिंक नहीं है और आपको "रीडलाइन" फ़ंक्शन के अपरिभाषित संदर्भ के बारे में त्रुटियां मिलेंगी।

0

मैंने पर अपनी शुरुआत की अपनी खुद की सूची बनाएं और एक ही समस्या में भाग गया। उपर्युक्त उत्तरों में से कोई भी मेरे लिए काम नहीं करता है। एक छोटे से शोध के बाद मुझे पता चला कि मैकोज़ में gnu रीडलाइन लाइब्रेरी नहीं है जो रीडलाइन फ़ंक्शंस प्रदान करती है, मैकओ के विभिन्न संस्करण एडिटलाइन नामक लाइब्रेरी का उपयोग करके रीडलाइन के अनुकरण प्रदान करते हैं। शुरू करने के लिए ...

man editline

#include <histedit.h>

ठीक है, editline आप लाइन इनपुट और इतिहास, और कार्यों उन पर संचालित करने के लिए कुछ structs देता है। सबसे पहले आपको इन structs को तुरंत चालू करना होगा। संपादन के लिए प्रलेखन बहुत उपयोगी नहीं है क्योंकि इसमें कोई उदाहरण नहीं है। ऐप्पल हेडर फ़ाइल उपलब्ध कराता है ताकि थोड़ा सा मदद मिल सके। http://www.opensource.apple.com/source/libedit/libedit-13/src/histedit.h

मैं इसके लिए नया हूं और यह अभी भी मेरे लिए बहुत भ्रमित था। डेबियन पैकेज के रूप में उपलब्ध libedit के लिए स्रोत कोड का कुछ संस्करण है। सौभाग्य से किसी से भी बुद्धिमान मैं पहले से ही इसमें खोला है और lbedit का उपयोग कर एक कमांड लाइन लागू किया है। उनका कोड यहां है: https://www.cs.utah.edu/~bigler/code/libedit.html। मैंने श्री बिगलर का कोड लिया, और से कोड अपनी खुद की सूची बनाएं, और इसे प्राप्त करने के लिए उन्हें एक साथ रखें।

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

नोटिस: structs कि उपयोग किया जाता है की इन्स्टेन्शियशन जबकि पाश के बाहर होता है, और इसलिए कार्यों कि स्मृति उन structs का उपयोग कर रहे मुक्त करते हैं। इस वजह से, मैंने बाहर निकलने के लिए कमांड जोड़ा, अन्यथा मुझे लगता है कि अगर लूप से बाहर निकलने का एकमात्र तरीका प्रोग्राम को बाधित कर रहा है तो स्मृति मेमोरी है। संकलन करने के लिए:

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

-ledit editline

से जोड़ने के लिए है, तो यह किसी भी प्रासंगिकता, मैं MacOS 10.4.11 का उपयोग कर रहा है की जरूरत है और यहाँ है मेरी संकलक, gcc --version

के उत्पादन में है पावरपीसी-सेब-डार्विन 8-जीसीसी-4.0.0 (जीसीसी) 4.0.0 20041026 (ऐप्पल कंप्यूटर, इंक बिल्ड 4061)

अब इसके साथ एकमात्र समस्या है, और पुस्तक यह इंगित करता है, सी-कोड पोर्टेबल माना जाता है और यह नहीं है। अगला चरण प्रीप्रोसेसर निर्देशों को जोड़ना होगा ताकि यह लिनक्स पर रीडलाइन और मैक पर एडिटलाइन का उपयोग करे।

संबंधित मुद्दे