একটি হেডার ফাইল কোথা থেকে অন্তর্ভুক্ত রয়েছে তা কীভাবে বলবেন?


102

আমি কীভাবে বলতে পারি যেখানে জি ++ একটি অন্তর্ভুক্ত ফাইলটি সন্ধান করতে সক্ষম হয়েছিল? মূলত যদি আমি

#include <foo.h>

g ++ পাথ যুক্ত করতে বা পরিবর্তন করতে যেকোন অন্তর্ভুক্ত বিকল্পগুলি ব্যবহার করে অনুসন্ধানের পথটি স্ক্যান করবে। তবে, দিন শেষে, foo.h এর পরম পথটি আমি কী বলতে পারি যে জি ++ সংকলন করতে বেছে নিয়েছে? বিশেষত প্রাসঙ্গিক যদি অনুসন্ধানের পথগুলির অগণিত একের বেশি foo.h থাকে।

ডিফল্টগুলি অন্তর্ভুক্ত করে এবং এর মধ্যে বিকল্পগুলি অন্তর্ভুক্ত করার পরে এর চূড়ান্ত অনুসন্ধানের পথটি কী তা আমাকে বলার জন্য জি ...+ পাওয়ার কোনও উপায় কী?


4
সম্পর্কিত: কোন সন্তানের অন্তর্ভুক্ত ফাইলের মধ্যে কোন পিতামাতার ফাইল অন্তর্ভুক্ত রয়েছে তা বলার কোনও উপায় আছে? অর্থাত্ অন্তর্ভুক্ত গ্রাফটি দেখানোর জন্য (ইঙ্গিত: gcc -E বেশিরভাগ ক্ষেত্রে নেই ... এটির উত্পাদন প্রক্রিয়াজাত হতে পারে))
ক্রেজি গ্লিউ

উত্তর:


78

এটি নির্ভরতা তৈরি করবে যা অন্তর্ভুক্ত ফাইলগুলির পরম পাথের তালিকা করে:

gcc  -M showtime.c

আপনি যদি না চান তবে সিস্টেমটিতে অন্তর্ভুক্ত রয়েছে (যেমন #include <something.h>) তবে ব্যবহার করুন:

gcc  -MM showtime.c

18
এটি লক্ষ করা উচিত যে আপনি যদি "-o myObj.o" এর সাথে একত্রে ব্যবহার করেন তবে আউটপুট সংকলিত বাইনারি নয়, "myObj.o" এ চলে যায়। -ম এর একটি অন্তর্নিহিত -E রয়েছে, তাই সংকলনটি রূপান্তরিত হয় না। আমি খুঁজে পেলাম - এমডি পরিবর্তে একটি খুব দরকারী বিকল্প, এটি সংকলন সম্পাদন করে এবং এর পরিবর্তে আউটপুটটি MyObj.d এ রাখে। * .O এর মতো অদ্ভুত প্রভাব ছাড়াই কেবল আপনার সংকলন লাইনে প্রিপেন্ডিংয়ের জন্য উপযুক্ত প্যারাম তৈরি করা এখন বাইনারিটির পরিবর্তে আউটপুট ধারণ করে। আপনার সাহায্যের জন্য ধন্যবাদ.
হার্ডসওয়্যার

সম্পর্কিত সমস্ত জিসিসি বিকল্পগুলি এখানে বর্ণিত হয়েছে
akhan

111
g++ -H ...

ফর্ম্যাটতে অন্তর্ভুক্ত ফাইলগুলির পুরো পথটিও মুদ্রণ করবে যা দেখায় যে কোন শিরোলেখ অন্তর্ভুক্ত রয়েছে


7
এটি আমার অভিজ্ঞতার চেয়ে এম থেকে বেশি সহায়ক বলে মনে হচ্ছে। আমি কি কি অন্তর্ভুক্ত এর শ্রেণিবিন্যাস প্রদর্শন পছন্দ করি।
ব্রায়ান মিন্টন

ভাল, এটি ডিবাগ উদ্দেশ্যে কার্যকর।

4
এটি সেরা উত্তর। আপনি অন্য কিছু পরিবর্তন না করে এটিকে আপনার বিল্ড প্রক্রিয়ায় যুক্ত করতে পারেন।
টিম্ম্ম্ম

4
এটি সত্যিকারের গৃহীত উত্তরের চেয়ে প্রশ্নের উত্তর দেয়। কেবল দুর্ভাগ্যজনক সমস্যাটি হ'ল আমি ক্ল্যাংকে ফাইলটি সাধারণত সংকলন করার চেষ্টা থেকে বিরত করতে পারি না, তাই আমি clang++ -MM -H(যা কিছুটা দরকারী সমন্বয়) ব্যবহার করে শেষ করেছি ।
rookie1024

@ rookie1024 clang++ -H -fsyntax-only ...আপনি যদি আউটপুট ফাইলগুলি তৈরি করা এড়াতে চান তবে ব্যবহার করুন (এটির gccজন্যও কাজ করে)।
লেকেনস্টেইন

8

অবশ্যই ব্যবহার

g++ -E -dI  ... (whatever the original command arguments were)

4
এই সমাধানের বিভিন্ন সুবিধা রয়েছে: ১. আপনি একটি একক শিরোলেখের ফাইলের একাধিক অন্তর্ভুক্তি আবিষ্কার করতে পারেন (-H এবং -M প্রতিটি অন্তর্ভুক্ত ফাইলটি একবারে মুদ্রণ করতে পারেন) ২. এটি কোথায় অন্তর্ভুক্ত রয়েছে তা আপনি দেখতে পারবেন (মূলের নাম এবং রেখা নম্বর) নির্দেশ অন্তর্ভুক্ত)। ৩. এর মাধ্যমে আপনি নির্ভরযোগ্যভাবে (!) শিরোনাম সরাসরি বা অপ্রত্যক্ষভাবে বা উভয়ই অন্তর্ভুক্ত কিনা তা পৃথক করতে পারেন (এটি
ক্লিনআপগুলির

5

যদি আপনি ব্যবহার করেন -MMবা কোনও সম্পর্কিত বিকল্প ( -M, ইত্যাদি) ব্যবহার করেন তবে আপনি কেবলমাত্র শিরোনামের তালিকা পাবেন যা অন্য সমস্ত প্রিপ্রোসেসর আউটপুট ছাড়াই অন্তর্ভুক্ত রয়েছে (যা আপনি প্রস্তাবিত g++ -E -dIসমাধানটি পেয়েছেন বলে মনে হয় )।


g++ -MM t.ccঠিক কোনভাবেই কোনও অন্তর্ভুক্তি দেখায় না t.o: t.cc। এর কি অন্য কিছু দরকার?
wallyk

4
চমৎকার - সম্পূর্ণতার জন্য, আপনি /showIncludesবিকল্পটি ব্যবহার করে এমএসভিসি এর সাথে একই রকম পেতে পারেন । এমএসভিসি এমনকি শিরোনামের বাসা বেঁধে দেওয়ার জন্যও ইনডেন্ট করবে (এটি জিসিসিতে দেখতে পাচ্ছি না -M)।
মাইকেল বুড়
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.