Apue से संकलन कोड


12

अभी-अभी मैंने पुस्तक पढ़ना शुरू किया है: UNIX® एन्वायर्नमेंट में एडवांस्ड प्रोग्रामिंग । मैं इसका पहला कोड उदाहरण चलाने की कोशिश करना चाहता था। मैं साइंटिफिक लिनक्स 6.4 चला रहा हूं।

मैंने स्रोत कोड डाउनलोड किया और जैसा कि इसके README में कहा गया है, मैं makeअसम्पीडित फ़ाइल में चला गया।

मैंने पहला प्रोग्राम लिखा (एक मॉक lsकमांड)

#include "./include/apue.h"
#include <dirent.h>

int
main(int argc, char *argv[])
{
    DIR           *dp;
    struct dirent *dirp;

    if(argc!=2)
        err_quit("usage: test directory_name");

    if((dp=opendir(argv[1]))==NULL)
        err_sys("Can't open %s", argv[1]);

    while((dirp=readdir(dp))!=NULL)
        printf("%s\n", dirp->d_name);

    closedir(dp);
    return 0;
}

और असम्पीडित फ़ाइल में डाल दिया। जैसा कि किताब ने सलाह दी थी, तब मैं भाग गया gcc myls.c:। लेकिन मुझे यह त्रुटि मिली:

# gcc myls.c
/tmp/ccWTWS2I.o: In function `main':
test.c:(.text+0x20): undefined reference to `err_quit'
test.c:(.text+0x5b): undefined reference to `err_sys'
collect2: ld returned 1 exit status

मैं जानना चाहता था कि मैं इस समस्या को कैसे ठीक कर सकता हूं। मैं यह भी चाहता हूं कि मैं किसी भी निर्देशिका में एक कोड लिखूं।


आप कहां err_{quit,sys}से आने की उम्मीद करते हैं?
क्रिस डाउन

असम्पीडित स्रोत कोड में, एक निर्देशिका है: includeजिसमें हेडर फ़ाइल है apue.h। लेकिन यह उस डायरेक्टरी की एकमात्र फाइल है। मुझे समझ नहीं आ रहा है कि वास्तविक फ़ंक्शन परिभाषाएँ कहाँ हैं! मुझे लगा कि कोई इस पुस्तक के स्रोत कोड फ़ाइल संरचना से परिचित हो सकता है।
मखलाघी

.hफ़ाइलों कार्यों के लिए protypes शामिल हैं। उनका क्रियान्वयन उन फाइलों .soया .aफाइलों में होता है, जिन्हें बॉक्स पर प्रस्तुत करने की आवश्यकता होती है। ये गतिशील और स्थैतिक पुस्तकालय हैं, जिनमें फ़ंक्शंस होते हैं।
SLM

यहां तक ​​कि क्या है apue.h?
आवाज

जवाबों:


13

UNIX® पर्यावरण में उन्नत प्रोग्रामिंग में कार्यक्रमों को कैसे लिखना और संकलित करना है, इसकी संक्षिप्त समीक्षा , मुझे चरणों को समझने में मदद करने के लिए स्लम के लिए धन्यवाद । आप यहाँ से सोर्स कोड डाउनलोड कर सकते हैं । काश यह जानकारी किताब के परिशिष्ट बी के हिस्से के रूप में शामिल होती, जहाँ हेडर फ़ाइल को समझाया जाता है।

असम्पीडित फ़ाइल में अध्यायों के नाम के साथ निर्देशिकाएं हैं और दो अन्य नाम includeऔर हैं lib। अध्यायों के नामों के साथ उनमें उस अध्याय के सभी कार्यक्रम हैं।

includeनिर्देशिका है कि इस पुस्तक में कार्यक्रमों के अधिकांश में प्रयोग किया जाता है हेडर फाइल में शामिल हैं: apue.hlibनिर्देशिका कि हेडर के लिए कार्यान्वयन के स्रोत कोड है।

मान लें कि असम्पीडित फ़ाइल यहाँ पर स्थित है: SCADDRESS/उदाहरण के लिए, यह हो सकता है: /home/yourid/Downloads/apue.3e/

एक बार जब आप स्रोत कोड को खोल देते हैं, तो निर्देशिका में जाएं और चलाएं make:

$ cd SCADDRESS
$ make

makeसभी अध्यायों में सभी कार्यक्रमों को संकलित करेगा। लेकिन महत्वपूर्ण बात यह है कि इससे पहले, यह पुस्तकालय बना देगा जिसमें कार्यों के कार्यान्वयन शामिल होंगे apue.h

पुस्तक से लिखने वाले एक उदाहरण कार्यक्रम को संकलित करने के लिए, इस GCC कमांड को चलाएं (यह मानते हुए कि आपके कार्यक्रम का नाम myls.cपुस्तक में पहला है):

gcc -o myls myls.c -I SCADDRESS/include/ -L SCADDRESS/lib/ -lapue

-Iबताता है gccफ़ाइल को शामिल देखने के लिए जो निर्देशिका। -Lइसे पुस्तकालय निर्देशिका का स्थान बताता है, और -lapue, उस निर्देशिका में देखने के लिए पुस्तकालय फ़ाइल का नाम बताता है। ऐसा है कि -LXXX का मतलब लाइब्रेरी डायरेक्टरी में फाइल को नाम से देखना है: libXXX.a या libXXX.so।


इसे कभी-कभी अधिक चेतावनी देने के -Wallलिए gccकमांड में जोड़ने के लिए ज्ञानवर्धक हो सकता है ।
मैटबियनको

3

मुझे लगता है कि यह स्टैकओवरफ़्लो Q & A शीर्षक: फ़ंक्शन इरेज़ल_एसवाईएस () कहाँ परिभाषित किया गया है? आपकी जरूरत है उस सूत्र में 2 उत्तर यह कहना था:

ए 1

इर_एसवाई () W. रिचर्ड स्टीवंस द्वारा लिखी गई कई पुस्तकों में उपयोग किया जाने वाला एक फ़ंक्शन है। इस फ़ंक्शन का उपयोग यह प्रिंट करने के लिए किया जाता है कि किस प्रकार की त्रुटि हुई।

फ़ंक्शन का उपयोग पाठ में प्रोग्राम्स में कस्टम हेडर फ़ाइल "ourhdr.h" (या कुछ और) के साथ किया जाता है। शीर्ष लेख सूची या फ़ंक्शन परिभाषा के लिए परिशिष्ट की जाँच करें।

ए 2

इस समारोह के लिए स्रोत (डब्ल्यू। रिचर्ड स्टीवंस द्वारा UNIX® पर्यावरण में उन्नत प्रोग्रामिंग से) पुस्तक की वेबसाइट: http://www.apuebook.com/ पर पाया जा सकता है ।

संदर्भ


धन्यवाद, लेकिन मेरी समस्या यह है कि इसे कैसे संकलित किया जाए, ताकि ये त्रुटियां सामने न आएं। यह err_sysसिर्फ एक उदाहरण है, उस हेडर फ़ाइल में अन्य कार्य हैं। इसलिए मैं इस समस्या का एक सामान्य उत्तर ढूंढ रहा हूं (हेडर फ़ाइल को कैसे शामिल किया जाए और इसे सफलतापूर्वक संकलित करें), इस विशेष फ़ंक्शन को फिर से लिखना नहीं।
मखलाघी

1
@makhlaghi - त्रुटियां b / c हैं जिन्हें आप अंतर्निहित कार्यान्वयन याद कर रहे हैं। आप आमतौर पर इन w / तर्कों gccका उपयोग करके -Lपुस्तकालयों का उपयोग करने के लिए संदर्भित करते हैं। पुस्तकालय .soया .aफाइलें हैं। यह ट्यूटोरियल परिचित होने में मददगार हो सकता है w / gcc, ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html । विशेष रूप से इस खंड: "हेडर फाइल और पुस्तकालय (मैं, एल और एल) के लिए सर्च कर रहे हैं"
SLM

मेरे साथ व्यवहार करने में आपके धैर्य के लिए बहुत बहुत धन्यवाद (अनुभवहीन होने के कारण!)। मैं समझ गया कि इसे कैसे संकलित करना है। मुझे इस कमांड का उपयोग करना है gcc -o myls myls.c -L LIBPOSITION -lapue:। जहां LIBPOSITION libअसम्पीडित निर्देशिका की निर्देशिका में है। एक बार फिर धन्यवाद।
मखलाघी

@ ममलघी - इसका उल्लेख न करें। मुझे दूसरों को यह समझने में मदद करना पसंद है कि चीजें कैसे काम करती हैं। मानो या न मानो, चीजों को समझाने से मुझे चीजों को बेहतर तरीके से समझने में मदद मिलती है। क्यू और सौभाग्य के लिए धन्यवाद w / आप gcc यात्रा!
SLM

2

निम्नलिखित चरणों ने मेरे लिए काम किया है (Ubuntu 14.04 64bit):

  1. wget http://www.apuebook.com/src.3e.tar.gzआधिकारिक पुस्तक साइट से gzipped tar संग्रह डाउनलोड करें
  2. tar xzf src.3e.tar.gzयह apue.3eडिफ़ॉल्ट रूप से वर्तमान निर्देशिका के तहत बुलाया unzipped फ़ोल्डर बनाता है
  3. cd apue.3e
  4. sudo apt-get install libbsd-dev। यह लिंक / एलबीएस / थ्रेड्स के लिए है
  5. make यह सभी फ़ोल्डरों में सभी स्रोत कोड को स्वचालित रूप से संकलित करेगा
  6. cd introफिर ./ls1 ..अपेक्षा के अनुसार काम करता है (मूल निर्देशिका से फ़ाइलें सूचीबद्ध करता है)

आपको पुस्तक से अन्य कोड स्निपेट खोजने के लिए चारों ओर पकड़ना पड़ सकता है, लेकिन यह सीधा होना चाहिए।


1

माखलिघी ने अपनी अंतिम टिप्पणी में जो बताया वह मेरे लिए काम किया लेकिन मुझे आधिकारिक वेबसाइट www.apuebook.com से अलग सोर्स कोड का उपयोग नहीं करना पड़ा।

मैंने जो प्रयोग किया है वह https://github.com/roktas/apue2e में पाया जा सकता है । जैसा कि किसी ने समझाया कि यह आधुनिक लिनक्स सिस्टम के साथ काम करने के लिए लागू किया गया है।


शायद आप इसे थोड़ा विस्तृत कर सकते हैं?
स्लम

0

मैंने यहां दिए गए कमांड लाइन निर्देश का उपयोग करके पुस्तकालय का सफलतापूर्वक निर्माण किया है। मुझे Xcode में एक नमूना बनाने में कठिनाइयाँ हुईं। इसे पूरा करने के लिए, मैंने हेडर फ़ाइलों और पुस्तकालयों के लिए खोज पथ परिभाषित किया है ("सेटिंग बनाएँ" फलक)। "लिंक बायनरी विद लाइब्रेरी" फलक की तुलना में मैंने पुस्तकालय को "बिल्ड चरणों" में ही परिभाषित किया है। उसके बाद, यह एक हवा है।


0

यदि ap.3.3e स्थापित है, तो आप अप को डिफ़ॉल्ट डिफ़ॉल्ट निर्देशिका में डालने की कोशिश कर सकते हैं, उदा:

code@lab:~/src/code$ sudo cp ../apue.3e/include/apue.h /usr/include/
code@lab:~/src/code$ sudo cp ../apue.3e/lib/libapue.a /usr/lib/

जब कोड संकलित किया जाता है, तो कृपया तर्क जोड़ें: -lapue

code@lab:~/src/code$ gcc -o myls myls.c -lapue
code@lab:~/src/code$ ./myls
Usage: ls <dir>

0

'ग़लती_सवाईज़' और 'ग़लती_सुख' एक फ़ाइल में मौजूद हैं, जिसे .c ग़लतीsओसी ’कहा जाता है, जो आपके वर्तमान वर्किंग डायरेक्टरी में नहीं है। सबसे पहले, अपने द्वारा डाउनलोड किए गए फोल्डर 'एप' को खोलें और उस फोल्डर में मौजूद सभी आइटम्स को कॉपी और असेंबल करें, उदाहरण के लिए, advio, डेमोंस, आदि, जो आपके वर्तमान वर्किंग डायरेक्टरी के लिए सब कुछ हैं। आप अपनी करंट वर्किंग डायरेक्टरी को जान सकते हैं। कमांड 'pwd.Now, फोल्डर में' का उपयोग करते हुए 'शामिल' आपको शीर्ष लेख फ़ाइल apue.Copy मिलेगा वह भी आपकी वर्तमान कार्यशील निर्देशिका के लिए। संक्षेप में, कोई भी .c फ़ाइल जिसे आप अपने प्रोग्राम में उपयोग करने जा रहे हैं। अपनी वर्तमान कार्यशील निर्देशिका में रहें। इसके लिए, उन सभी फ़ाइलों को अपनी वर्तमान कार्यशील निर्देशिका में कॉपी करें।

अब, अपनी समस्या को हल करने के लिए। इरनोसी फाइल एप फोल्डर में लिबर फोल्डर में है। वर्तमान में आपकी वर्किंग डायरेक्टरी के लिए। यह आपकी समस्या का समाधान करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.