অপু থেকে কোড সংকলন


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

লিখতে এবং প্রোগ্রাম কম্পাইল করার একটি সংক্ষিপ্ত পর্যালোচনা ইউনিক্স পরিবেশ উন্নত প্রোগ্রামিং করার, ধন্যবাদ SLM আমাকে সাহায্য করার জন্য পদক্ষেপ বুঝতে। আপনি এখান থেকে উত্স কোডটি ডাউনলোড করতে পারেন । আমি আশা করি বইটির পরিশিষ্ট খের অংশ হিসাবে এই তথ্য অন্তর্ভুক্ত করা হয়েছে, যেখানে শিরোনাম ফাইলটি ব্যাখ্যা করা হয়েছে।

সঙ্কুচিত ফাইলটিতে অধ্যায়গুলির নাম এবং দু'জনের নাম includeএবং আরও দুটি ডিরেক্টরি রয়েছে lib। অধ্যায়গুলির নামগুলির সাথে সেগুলির মধ্যে এই অধ্যায়ের সমস্ত প্রোগ্রাম রয়েছে।

includeযে ডিরেক্টরি বইয়ে প্রোগ্রামের সবচেয়ে ব্যবহৃত হয় হেডার ফাইল রয়েছে: apue.hlibযে ডিরেক্টরি হেডারের জন্য বাস্তবায়নের উৎস কোড আছে।

অনুমান করা যাক সঙ্কুচিত ফাইলটি এখানে অবস্থিত: SCADDRESS/উদাহরণস্বরূপ এটি হতে পারে: /home/yourid/Downloads/apue.3e/

আপনি একবার সোর্স কোডটি সঙ্কুচিত করার পরে ডিরেক্টরিতে যান এবং চালনা করুন make:

$ cd SCADDRESS
$ make

makeসমস্ত অধ্যায়গুলিতে সমস্ত প্রোগ্রাম সংকলন করবে। তবে গুরুত্বপূর্ণ বিষয়টি এটির আগে, এটি লাইব্রেরি তৈরি করবে যা এতে ফাংশনগুলির বাস্তবায়নকে ধারণ করে apue.h

আপনি বইটি থেকে যে উদাহরণটি লিখেছেন তার একটি সংকলন করতে, এই জিসিসি কমান্ডটি চালান (আপনার প্রোগ্রামটির নামটি myls.cগ্রন্থে প্রথম যা ধরে নিচ্ছেন):

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

-Igccঅন্তর্ভুক্ত ফাইলটির জন্য কোন ডিরেক্টরিটি অনুসন্ধান করতে হবে তা বলে । -Lএটি লাইব্রেরি ডিরেক্টরিটির অবস্থান এবং এটি ডিরেক্টরিতে -lapueসন্ধানের জন্য লাইব্রেরি ফাইলের নাম বলে। যেমন -LXXX এর অর্থ লাইব্রেরি ডিরেক্টরিতে একটি ফাইল সন্ধান করা: libXXX.a বা libXXX.so with


এটি প্রায়শই সতর্ক করার জন্য কমান্ডটি যুক্ত -Wallকরা কখনও কখনও আলোকিত হতে পারে gcc
ম্যাটবিয়ানকো

3

আমি এই স্ট্যাকওভারফ্লো প্রশ্নোত্তর শিরোনাম: ফাংশন err_sys () সংজ্ঞায়িত করা হয় যেখানে? আপনার যা দরকার তা আছে এই থ্রেডের উত্তরগুলির 2 টিতে এই কথাটি ছিল:

ক 1

এরর_সিস () হ'ল ডাব্লু রিচার্ড স্টিভেনস রচিত বেশ কয়েকটি বইয়ে ব্যবহৃত একটি ফাংশন। কোন ধরণের ত্রুটি ঘটেছে তা মুদ্রণের জন্য এই ফাংশনটি ব্যবহৃত হয়।

ফাংশনটি কাস্টম শিরোনাম ফাইল "ourhdr.h" (বা অন্য কিছু) সহ পাঠ্যগুলিতে প্রোগ্রামগুলিতে ব্যবহৃত হয়। শিরোনাম তালিকা বা ফাংশন সংজ্ঞা জন্য পরিশিষ্ট পরীক্ষা করুন।

A2,

এই ফাংশনের উত্স (ইউএনআইএক্স® এনভায়রনমেন্টে অ্যাডভান্সড প্রোগ্রামিং থেকে ডাব্লু। রিচার্ড স্টিভেনস দ্বারা) বইটির ওয়েবসাইটে পাওয়া যাবে: http://www.apuebook.com/

তথ্যসূত্র


ধন্যবাদ, তবে আমার সমস্যাটি কীভাবে এটি সংকলন করা যায়, তাই এই ত্রুটিগুলি সামনে আসে না। err_sysশুধু একটি উদাহরণ হল যে, হেডার ফাইলে অন্যান্য কার্যাবলী আছে। সুতরাং আমি এই সমস্যাটির একটি জেনেরিক উত্তর খুঁজছি (কীভাবে শিরোনাম ফাইলটি অন্তর্ভুক্ত করা যায় এবং সফলভাবে এটি সংকলন করা যায়), এই নির্দিষ্ট ফাংশনটি পুনরায় লেখার জন্য নয়।
মাখলাগী

1
@ মাখলাগী - ত্রুটিগুলি খ / সি আপনি অন্তর্নিহিত বাস্তবায়নগুলি মিস করছেন missing আপনি সাধারণত এই ডাব্লু / gccব্যবহার -Lকরার জন্য লাইব্রেরিগুলিকে উল্লেখ করে যুক্তিগুলি অন্তর্ভুক্ত করেন । গ্রন্থাগারগুলি হল ফাইল .soবা .aফাইল। এই টিউটোরিয়ালটি W / gcc, ntu.edu.sg/home/ehchua/programming/cpp/gcc_make.html পরিচিতি পেতে সহায়ক হতে পারে । বিশেষত এই বিভাগ: "শিরোলেখ ফাইল এবং গ্রন্থাগারগুলির জন্য অনুসন্ধান (-I, -L এবং -l)"
slm

আমার সাথে আচরণ করার ক্ষেত্রে আপনার ধৈর্যের জন্য অনেক ধন্যবাদ (অনভিজ্ঞ!)। আমি কীভাবে এটি সংকলন করব তা বুঝতে পেরেছি। আমি এই কমান্ড ব্যবহার করতে হবে: gcc -o myls myls.c -L LIBPOSITION -lapue। যেখানে LIBPOSITION সঙ্কুচিত libডিরেক্টরিটির ডিরেক্টরিতে রয়েছে। আবার ধন্যবাদ.
মাখলাগী

@ মাখলাগী - এটি উল্লেখ করবেন না। আমি জিনিসগুলি কীভাবে কাজ করে তা বুঝতে অন্যকে সহায়তা করা পছন্দ করি। বিশ্বাস করুন বা না করুন, বিষয়গুলি ব্যাখ্যা করে তা আমাকে জিনিসগুলি আরও ভালভাবে বুঝতে সহায়তা করে। Q এবং শুভকামার জন্য ধন্যবাদ / আপনি জিসিসি যাত্রা!
slm

2

নিম্নলিখিত পদক্ষেপগুলি আমার পক্ষে কাজ করেছে (উবুন্টু 14.04 64 বিট):

  1. wget http://www.apuebook.com/src.3e.tar.gzঅফিসিয়াল বইয়ের সাইট থেকে জিজিপড টার আর্কাইভটি ডাউনলোড করুন
  2. tar xzf src.3e.tar.gzএটি apue.3eডিফল্টরূপে বর্তমান ডিরেক্টরি অধীন কলবিহীন ফোল্ডারটি তৈরি করে
  3. cd apue.3e
  4. sudo apt-get install libbsd-dev। এটি / থ্রেড -lbsd লিঙ্কটির জন্য
  5. make এটি স্বয়ংক্রিয়ভাবে সমস্ত ফোল্ডারে সমস্ত উত্স কোড সংকলন করবে
  6. cd introতারপরে ./ls1 ..প্রত্যাশিত হিসাবে কাজ করে (পিতামহুল ডিরেক্টরি থেকে ফাইলগুলি তালিকাবদ্ধ করে)

বই থেকে অন্যান্য কোড স্নিপেটগুলি খুঁজতে আপনাকে প্রায় গ্রাইপ করতে হতে পারে তবে এটি সোজা হওয়া উচিত।


1

মাখলিঘি তার শেষ মন্তব্যে যা ব্যাখ্যা করেছে তা আমার পক্ষে কাজ করেছিল তবে আমাকে অফিসিয়াল ওয়েবসাইট www.apuebook.com থেকে আলাদা আলাদা সোর্স কোড ব্যবহার করতে হয়নি।

আমি যেটি ব্যবহার করেছি তা https://github.com/roktas/apue2e এ পাওয়া যাবে । কেউ যেমন ব্যাখ্যা করেছেন এটি আধুনিক লিনাক্স সিস্টেমের সাথে কাজ করার জন্য এটি প্রয়োগ করা হয়েছে।


সম্ভবত আপনি এই কিছুটা ব্যাখ্যা করতে পারেন?
slm

0

আমি এখানে প্রদত্ত কমান্ড লাইন নির্দেশ ব্যবহার করে গ্রন্থাগারটি সফলভাবে তৈরি করেছি। এক্সকোডে একটি নমুনা তৈরি করতে আমার সমস্যা হয়েছে। এটি সম্পন্ন করার জন্য, আমি শিরোনাম ফাইল এবং লাইব্রেরিগুলির জন্য অনুসন্ধানের পাথগুলি সংজ্ঞায়িত করেছি ("বিল্ডিং সেটিংস" ফলক)। "লাইব্রেরিগুলির সাথে লিঙ্ক বাইনারি" পেনের চেয়ে আমি "বিল্ড পর্যায়সমূহ" তে লাইব্রেরিটি নিজেই সংজ্ঞায়িত করেছি। তারপরে, এটি একটি বাতাস।


0

যদি apue.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

'err_sys' এবং 'err_quit' 'errno.c' নামে একটি ফাইল উপস্থিত রয়েছে যা আপনার বর্তমান ওয়ার্কিং ডিরেক্টরিতে নেই। প্রথমত, আপনি 'অপিউ' ফোল্ডারটি খুলুন যা আপনি ডাউনলোড করেছেন এবং সঙ্কুচিত করেছেন এবং সেই ফোল্ডারে থাকা সমস্ত আইটেম অনুলিপি করুন, উদাহরণস্বরূপ, অ্যাডিও, ডেমনস, ইত্যাদি, আপনার বর্তমান কার্যনির্বাহী ডিরেক্টরিতে সমস্ত কিছু। আপনি আপনার বর্তমান ওয়ার্কিং ডিরেক্টরিটি জানতে পারবেন 'pwd'.NOW কমান্ডটি ব্যবহার করে এখন' অন্তর্ভুক্ত 'ফোল্ডারে আপনি শিরোনামের ফাইলটি apue খুঁজে পাবেন too এটি আপনার বর্তমান কার্যনির্বাহী ডিরেক্টরিতেও কপি করুন n সংক্ষেপে, আপনি আপনার প্রোগ্রামে যে কোনও .c ফাইল ব্যবহার করতে যাচ্ছেন অবশ্যই আপনার বর্তমান ওয়ার্কিং ডিরেক্টরিতে থাকুন। সুতরাং, এই সমস্ত ফাইল আপনার বর্তমান কার্যকরী ডিরেক্টরিতে অনুলিপি করুন।

এখন, আপনার সমস্যা সমাধানের জন্য The errno.c ফাইলটি অপু ফোল্ডারের লিব ফোল্ডারে রয়েছে your আপনার বর্তমান ওয়ার্কিং ডিরেক্টরিতে কপি করুন hat এটি আপনার সমস্যার সমাধান করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.