সিসি এবং সি ++ শিরোনাম ফাইলগুলির জন্য জিসিসি কোথায় সন্ধান করবে?


185

ইউনিক্স সিস্টেমে জিসিসি কোথায় হেডার ফাইলগুলি সন্ধান করে?

আমি আজ সকালে কিছু সিস্টেমের শিরোনাম ফাইলগুলির সন্ধানে কিছুটা সময় ব্যয় করেছি, তাই আমি ভেবেছিলাম এটি এখানে রাখা ভাল তথ্য হবে।

উত্তর:


227
`gcc -print-prog-name=cc1plus` -v

এই কমান্ডটি জি সি সি কে জিজ্ঞাসা করে যে এটি কোন সি ++ প্রিপ্রসেসর ব্যবহার করছে এবং তারপরে সেই প্রিপ্রসেসরটিকে জিজ্ঞাসা করে যেখানে এটি অন্তর্ভুক্ত রয়েছে।

আপনি আপনার নির্দিষ্ট সেটআপের জন্য একটি নির্ভরযোগ্য উত্তর পাবেন।

অনুরূপভাবে, জন্য সি প্রাক প্রসেসর:

`gcc -print-prog-name=cpp` -v

2
এর অর্থ কী? আমি এটি অনুসন্ধান করা কঠিন খুঁজে পাচ্ছি।
মিজিটুরকা


5
আমি সি প্রাক প্রসেসর হয় cppপরিবর্তে cc1? আমার ডেবিয়ান জেসি $(gcc -print-prog-name=cpp) -v(সঠিকভাবে) আরও একটি পথ দেয় যা হ'ল/usr/include/x86_64-linux-gnu
wlnirvana

3
আপনি যদি ইনপুটটির জন্য অপেক্ষা না করতে চান তবে ইনপুট থেকে পুনর্নির্দেশ করুন /dev/null, তাই `gcc -print-prog-name=cc1` -v < /dev/null
স্টিভ জর্জেনসেন

পুনঃটুইট অথবা Ctrl+ টিপুন D, যা ইউনিক্স-টকটিতে "ফাইলের শেষ" প্রেরণ করে।
ড্রয় ডোরম্যান

40

এছাড়াও, gcc -Iঅপশনটির পরে নির্দিষ্ট ডিরেক্টরিগুলিতে সন্ধান করবে ।



4
@ টোটাম: আপনার ফন্টটি পরীক্ষা করুন! এই উত্তরটিতে "-I" (মূলধন "চোখ") "-l" (লোয়ারকেস "ইল") ব্যবহার করে না।

3
-আমি <অ্যাঙ্গেলব্রিকেটেড.হ>> এর জন্য যেখানে -উইটটি "quotedfiles.h"
জেকোমাউ অ্যাক্টেক্স

28

আপনি এমন একটি ফাইল তৈরি করতে পারেন যা বগাস সিস্টেম শিরোলেখ অন্তর্ভুক্ত করার চেষ্টা করে। যদি আপনি এই জাতীয় উত্সটিতে ভারসাইজ মোডে জিসিসি চালান, এটি বোগাস শিরোলেখের মতো দেখতে সমস্ত সিস্টেমে লোকেশন অন্তর্ভুক্ত করে।

$ 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

3
আমার মনে হয় আপনি যদি "-v বিকল্পটি ব্যবহার করুন" বলেছিলেন তবে এটি আরও সহায়ক হবে।
জে কনরোড

আচ্ছা আপনি যদি কোনও সি-ফাইল ছাড়াই "-v" ব্যবহার করেন যার মধ্যে একটি অস্তিত্ব নেই এমন সিস্টেমের শিরোলেখ অন্তর্ভুক্ত থাকে তবে আপনি সমস্ত অন্তর্ভুক্ত পাথগুলিতে জিসিসি পুনরাবৃত্তি করতে পারবেন না। আমার উত্তরের মূলটি হ'ল সিস্টেম শিরোনাম হিসাবে তালিকাভুক্ত বোগাস।
diciu

@ জে - আপনি ঠিক বলেছেন, এটি খুব অস্পষ্ট ছিল - শেল স্ক্রিপ্টে আমি কী করছি তা আমি ব্যাখ্যা করেছি।
diciu

9
অস্থায়ী ফাইল ছাড়াই:echo "#include <bogus.h>" | gcc -v -x c -
thejoshwolfe

2
gcc -v -E - < /dev/nullবা cpp -v < /dev/nullযথেষ্ট। আপনাকে চালানোর জন্য কেবলমাত্র প্রিপ্রোসেসর পেতে হবে, এটি কোনও ইনপুট দেখে তা বিবেচ্য নয়। (অনুসন্ধানের পথগুলি প্রারম্ভকালে মুদ্রণ করা হয়, এমনকি এটির ইনপুটটি দেখার আগেও looks)
zwol

17

সিপিপি অনুচ্ছেদ এর জিসিসি ম্যানুয়াল নির্দেশ করে যে হেডার ফাইল নিম্নলিখিত ডিরেক্টরিগুলি মধ্যে অবস্থিত হতে পারে:

জিসিসি শিরোনামের জন্য বিভিন্ন স্থানে সন্ধান করে। একটি সাধারণ ইউনিক্স সিস্টেমে, আপনি যদি অন্যথায় এটি নির্দেশ না দেন তবে এটি # অন্তর্ভুক্ত সহ অনুরোধ করা শিরোনামগুলি সন্ধান করবে:

 /usr/local/include
 libdir/gcc/target/version/include
 /usr/target/include
 /usr/include

সি ++ প্রোগ্রামগুলির জন্য, এটি প্রথমে / usr / অন্তর্ভুক্ত / জি ++ - ভি 3 এও দেখবে।


এটি আপনার বর্তমান সিসির সংস্করণটির জন্য দুর্দান্ত। প্রকৃত ডিরেক্টরিগুলি এটি সন্ধান করে যখন সিসিটি নির্মিত হয়েছিল তখন নির্দিষ্ট বিকল্পগুলির উপর নির্ভর করে। আরও উন্নততর সমাধানের জন্য শ্রমোপি উত্তর দেখুন।
মার্টিন ইয়র্ক

PS: আমার সি ++ হেডার ফাইলগুলি এতে রয়েছে: /usr/incolve/c++/4.0.0
মার্টিন ইয়র্ক

3
@ মার্টিন: আপনি পুরানো স্কুল। খনিটি /usr/incolve/c++/4.2 :) এ আছে
দ্য টিকটিকিটি

10

সিস্টেমের শিরোনামগুলির সন্ধান করবে এমন ডিরেক্টরিগুলির সম্পূর্ণ সেট মুদ্রণ করতে জিসিসিকে পেতে, এটির জন্য অনুরোধ করুন:

$ 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 অনূদিত।)


9
g++ -print-search-dirs
gcc -print-search-dirs

3
এই কমান্ডগুলি লিঙ্ক গ্রন্থাগারগুলি এবং সংকলকের অভ্যন্তরীণ উপাদানগুলির জন্য ডিফল্ট অনুসন্ধানের পথগুলি মুদ্রণ করে; তারা আপনাকে শিরোলেখ ফাইল সম্পর্কে কিছু বলবে না।
zwol

6

সংকলক শিরোলেখ ফাইলগুলির জন্য সন্ধানকারী পাথের সেটটি কমান্ড দ্বারা পরীক্ষা করা যেতে পারে:

সিপিপি -ভি

আপনি যদি # অন্তর্ভুক্ত "" ঘোষণা করেন তবে সংকলক প্রথমে উত্স ফাইলের বর্তমান ডিরেক্টরিতে অনুসন্ধান করে এবং যদি পাওয়া না যায় তবে উপরের পুনরুদ্ধার করা ডিরেক্টরিগুলিতে অনুসন্ধান চালিয়ে যেতে হবে।

আপনি যদি # অন্তর্ভুক্ত <> ঘোষণা করেন তবে সংকলক উপরের কমান্ড থেকে প্রাপ্ত ডিরেক্টরিগুলি সরাসরি অনুসন্ধান করে।

সূত্র: - http://commandlinefanatic.com/cgi-bin/showarticle.cgi?article=art026


1

নিম্নলিখিতটি পরীক্ষা করে কেউ বাশ থেকে সি প্রোগ্রামের (অতিরিক্ত) অন্তর্ভুক্ত পথটি দেখতে পারে:

echo $C_INCLUDE_PATH

যদি এটি খালি থাকে, তবে এটির দ্বারা ডিফল্টরূপে অবস্থানগুলি অন্তর্ভুক্ত করার জন্য এটি সংশোধন করা যেতে পারে:

export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/include

1

এগুলি হ'ল ডিরেক্টরিগুলি যা জিসিসি ডিফল্টরূপে নির্দিষ্ট শিরোলেখ ফাইলগুলির জন্য দেখায় (শিরোনামের ফাইলগুলি শেভ্রন <> এ অন্তর্ভুক্ত করা হয়েছে;); 1. / usr / স্থানীয় / অন্তর্ভুক্ত / - তৃতীয় পক্ষের হেডার ফাইলগুলির জন্য ব্যবহৃত। 2. / usr / অন্তর্ভুক্ত / - সিস্টেম শিরোনাম ফাইলগুলির জন্য ব্যবহৃত।

যদি আপনি উল্লিখিত ডিরেক্টরিগুলি বাদ দিয়ে অন্য কোনও জায়গায় নিজের কাস্টম শিরোনাম ফাইলটি রাখার সিদ্ধান্ত নেন তবে শেভরনের পরিবর্তে ফাইল পাথের সাহায্যে উদ্ধৃতি ("./custom_header_files/foo.h") ব্যবহার করুন: ১। বিবৃতি অন্তর্ভুক্ত। ২. কোডটি সংকলনের সময় -I সুইচ ব্যবহার করুন using জিসিসি -আই / হোম / ইউজার / কাস্টম_হেডারস / -সি foo.c -p foo.o মূলত -I সুইচটি সংকলককে -I সুইচ (নির্দিষ্ট মানের ডিরেক্টরি যাচাই করার আগে) দিয়ে নির্দিষ্ট ডিরেক্টরিটি দেখতে প্রথমে বলে tells -আই ব্যবহার করে শিরোনাম ফাইলগুলি শেভরন ব্যবহার করে অন্তর্ভুক্ত থাকতে পারে।

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