ইউনিক্স সিস্টেমে জিসিসি কোথায় হেডার ফাইলগুলি সন্ধান করে?
আমি আজ সকালে কিছু সিস্টেমের শিরোনাম ফাইলগুলির সন্ধানে কিছুটা সময় ব্যয় করেছি, তাই আমি ভেবেছিলাম এটি এখানে রাখা ভাল তথ্য হবে।
ইউনিক্স সিস্টেমে জিসিসি কোথায় হেডার ফাইলগুলি সন্ধান করে?
আমি আজ সকালে কিছু সিস্টেমের শিরোনাম ফাইলগুলির সন্ধানে কিছুটা সময় ব্যয় করেছি, তাই আমি ভেবেছিলাম এটি এখানে রাখা ভাল তথ্য হবে।
উত্তর:
`gcc -print-prog-name=cc1plus` -v
এই কমান্ডটি জি সি সি কে জিজ্ঞাসা করে যে এটি কোন সি ++ প্রিপ্রসেসর ব্যবহার করছে এবং তারপরে সেই প্রিপ্রসেসরটিকে জিজ্ঞাসা করে যেখানে এটি অন্তর্ভুক্ত রয়েছে।
আপনি আপনার নির্দিষ্ট সেটআপের জন্য একটি নির্ভরযোগ্য উত্তর পাবেন।
অনুরূপভাবে, জন্য সি প্রাক প্রসেসর:
`gcc -print-prog-name=cpp` -v
cpp
পরিবর্তে cc1
? আমার ডেবিয়ান জেসি $(gcc -print-prog-name=cpp) -v
(সঠিকভাবে) আরও একটি পথ দেয় যা হ'ল/usr/include/x86_64-linux-gnu
/dev/null
, তাই `gcc -print-prog-name=cc1` -v < /dev/null
।
Ctrl
+ টিপুন D
, যা ইউনিক্স-টকটিতে "ফাইলের শেষ" প্রেরণ করে।
এছাড়াও, gcc -I
অপশনটির পরে নির্দিষ্ট ডিরেক্টরিগুলিতে সন্ধান করবে ।
আপনি এমন একটি ফাইল তৈরি করতে পারেন যা বগাস সিস্টেম শিরোলেখ অন্তর্ভুক্ত করার চেষ্টা করে। যদি আপনি এই জাতীয় উত্সটিতে ভারসাইজ মোডে জিসিসি চালান, এটি বোগাস শিরোলেখের মতো দেখতে সমস্ত সিস্টেমে লোকেশন অন্তর্ভুক্ত করে।
$ echo "#include <bogus.h>" > t.c; gcc -v t.c; rm t.c
[..]
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/usr/lib/gcc/i686-apple-darwin9/4.0.1/include
/usr/include
/System/Library/Frameworks (framework directory)
/Library/Frameworks (framework directory)
End of search list.
[..]
t.c:1:32: error: bogus.h: No such file or directory
echo "#include <bogus.h>" | gcc -v -x c -
gcc -v -E - < /dev/null
বা cpp -v < /dev/null
যথেষ্ট। আপনাকে চালানোর জন্য কেবলমাত্র প্রিপ্রোসেসর পেতে হবে, এটি কোনও ইনপুট দেখে তা বিবেচ্য নয়। (অনুসন্ধানের পথগুলি প্রারম্ভকালে মুদ্রণ করা হয়, এমনকি এটির ইনপুটটি দেখার আগেও looks)
সিপিপি অনুচ্ছেদ এর জিসিসি ম্যানুয়াল নির্দেশ করে যে হেডার ফাইল নিম্নলিখিত ডিরেক্টরিগুলি মধ্যে অবস্থিত হতে পারে:
জিসিসি শিরোনামের জন্য বিভিন্ন স্থানে সন্ধান করে। একটি সাধারণ ইউনিক্স সিস্টেমে, আপনি যদি অন্যথায় এটি নির্দেশ না দেন তবে এটি # অন্তর্ভুক্ত সহ অনুরোধ করা শিরোনামগুলি সন্ধান করবে:
/usr/local/include
libdir/gcc/target/version/include
/usr/target/include
/usr/include
সি ++ প্রোগ্রামগুলির জন্য, এটি প্রথমে / usr / অন্তর্ভুক্ত / জি ++ - ভি 3 এও দেখবে।
সিস্টেমের শিরোনামগুলির সন্ধান করবে এমন ডিরেক্টরিগুলির সম্পূর্ণ সেট মুদ্রণ করতে জিসিসিকে পেতে, এটির জন্য অনুরোধ করুন:
$ LC_ALL=C gcc -v -E -xc - < /dev/null 2>&1 |
LC_ALL=C sed -ne '/starts here/,/End of/p'
যা ফর্মের আউটপুট উত্পাদন করবে
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/x86_64-linux-gnu/5/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include
End of search list.
আপনার যদি -I
কমান্ড লাইনে-পারিবারিক বিকল্পগুলি থাকে তবে তারা প্রিন্টেড কীভাবে প্রভাবিত করবে।
( sed
কমান্ডের সব পরিত্রাণ পেতে হয় অন্যান্য আবর্জনা এই আবাহন কপি করে প্রিন্ট ও LC_ALL=C
তা নিশ্চিত করার জন্য নয় sed
- "অনুসন্ধান তালিকার শেষে" "এখানে শুরু হয়" এবং বাক্যাংশ কমান্ডটি কার্যকরী হয় IIRC অনূদিত।)
g++ -print-search-dirs
gcc -print-search-dirs
সংকলক শিরোলেখ ফাইলগুলির জন্য সন্ধানকারী পাথের সেটটি কমান্ড দ্বারা পরীক্ষা করা যেতে পারে:
সিপিপি -ভি
আপনি যদি # অন্তর্ভুক্ত "" ঘোষণা করেন তবে সংকলক প্রথমে উত্স ফাইলের বর্তমান ডিরেক্টরিতে অনুসন্ধান করে এবং যদি পাওয়া না যায় তবে উপরের পুনরুদ্ধার করা ডিরেক্টরিগুলিতে অনুসন্ধান চালিয়ে যেতে হবে।
আপনি যদি # অন্তর্ভুক্ত <> ঘোষণা করেন তবে সংকলক উপরের কমান্ড থেকে প্রাপ্ত ডিরেক্টরিগুলি সরাসরি অনুসন্ধান করে।
সূত্র: - http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026
নিম্নলিখিতটি পরীক্ষা করে কেউ বাশ থেকে সি প্রোগ্রামের (অতিরিক্ত) অন্তর্ভুক্ত পথটি দেখতে পারে:
echo $C_INCLUDE_PATH
যদি এটি খালি থাকে, তবে এটির দ্বারা ডিফল্টরূপে অবস্থানগুলি অন্তর্ভুক্ত করার জন্য এটি সংশোধন করা যেতে পারে:
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include
এগুলি হ'ল ডিরেক্টরিগুলি যা জিসিসি ডিফল্টরূপে নির্দিষ্ট শিরোলেখ ফাইলগুলির জন্য দেখায় (শিরোনামের ফাইলগুলি শেভ্রন <> এ অন্তর্ভুক্ত করা হয়েছে;); 1. / usr / স্থানীয় / অন্তর্ভুক্ত / - তৃতীয় পক্ষের হেডার ফাইলগুলির জন্য ব্যবহৃত। 2. / usr / অন্তর্ভুক্ত / - সিস্টেম শিরোনাম ফাইলগুলির জন্য ব্যবহৃত।
যদি আপনি উল্লিখিত ডিরেক্টরিগুলি বাদ দিয়ে অন্য কোনও জায়গায় নিজের কাস্টম শিরোনাম ফাইলটি রাখার সিদ্ধান্ত নেন তবে শেভরনের পরিবর্তে ফাইল পাথের সাহায্যে উদ্ধৃতি ("./custom_header_files/foo.h") ব্যবহার করুন: ১। বিবৃতি অন্তর্ভুক্ত। ২. কোডটি সংকলনের সময় -I সুইচ ব্যবহার করুন using জিসিসি -আই / হোম / ইউজার / কাস্টম_হেডারস / -সি foo.c -p foo.o মূলত -I সুইচটি সংকলককে -I সুইচ (নির্দিষ্ট মানের ডিরেক্টরি যাচাই করার আগে) দিয়ে নির্দিষ্ট ডিরেক্টরিটি দেখতে প্রথমে বলে tells -আই ব্যবহার করে শিরোনাম ফাইলগুলি শেভরন ব্যবহার করে অন্তর্ভুক্ত থাকতে পারে।