জিসিসি নীচের হেডার ফাইলটি কীভাবে সন্ধান করবে?


10

আমি sys/ptrace.hআমার সি প্রোগ্রামে অন্তর্ভুক্ত করেছি ।

আউটপুট /usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 -vনিম্নলিখিত পাথগুলি দেয় যেখানে জিসিসি শিরোনাম ফাইলগুলির জন্য অনুসন্ধান করে

#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/4.8/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed
 /usr/include
End of search list.

gcc -Mআমার প্রোগ্রামের জন্য আউটপুট নিম্নলিখিত শিরোনাম ফাইল অবস্থান দেয়

    pt.o: pt.c /usr/include/stdc-predef.h /usr/include/stdio.h \
 /usr/include/features.h /usr/include/x86_64-linux-gnu/sys/cdefs.h \
 /usr/include/x86_64-linux-gnu/bits/wordsize.h \
 /usr/include/x86_64-linux-gnu/gnu/stubs.h \
 /usr/include/x86_64-linux-gnu/gnu/stubs-64.h \
 /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stddef.h \
 /usr/include/x86_64-linux-gnu/bits/types.h \
 /usr/include/x86_64-linux-gnu/bits/typesizes.h /usr/include/libio.h \
 /usr/include/_G_config.h /usr/include/wchar.h \
 /usr/lib/gcc/x86_64-linux-gnu/4.8/include/stdarg.h \
 /usr/include/x86_64-linux-gnu/bits/stdio_lim.h \
 /usr/include/x86_64-linux-gnu/bits/sys_errlist.h \
 /usr/include/x86_64-linux-gnu/sys/ptrace.h

যেহেতু /usr/include/x86_64-linux-gnu/প্রথম আউটপুটে অন্তর্ভুক্ত নেই, জিসিসি কীভাবে খুঁজে পাবে sys/ptrace.h?

সম্পাদনা করুন:

আউটপুট echo '#include <sys/ptrace.h>' | gcc -fsyntax-only -xc -v -H -ফলাফল

Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) 

এটি পুনরাবৃত্তভাবে তাকিয়ে আছে /usr/include.. আপনি কোন সমস্যার সমাধানের চেষ্টা করছেন?
রামহাউন্ড

এটি পুনরাবৃত্তভাবে দেখে মনে হচ্ছে না। যদি এটি হয়, সিস / উপসর্গ অন্তর্ভুক্ত করার প্রয়োজন হবে না। শুধু ptrace.h সহ, উদাহরণস্বরূপ, কাজ করে না।
ব্যবহারকারী 912083132

আমি মনে করি না আপনি অন্তর্ভুক্ত /sys/ptrace.hকিন্তু sys/ptrace.h, তাই না?
ব্যবহারকারী 253751

এটি অবশ্যই জিসিসির "মাল্টার্ক" প্যাচগুলিতে একটি বাগ। ডিরেক্টরি /usr/include/x86_64-linux-gnu হয় চিকিত্সা করা হচ্ছে যেমন একটি সিস্টেম ডিরেক্টরির অন্তর্ভুক্ত করা এবং উচিত সন্ধান-পাথ তালিকা দ্বারা মুদ্রিত অন্তর্ভুক্ত করা gcc -v। আমি নিশ্চিত না যে কেউ কীভাবে এই বাগটি অর্জন করতে সক্ষম হয়েছিল; যদি আমি সঠিকভাবে মনে রাখি, সিস্টেম যুক্ত করার সর্বাধিক সুস্পষ্ট পদ্ধতিতে ডিরেক্টরিগুলি অন্তর্ভুক্ত করে তাতে কী মুদ্রিত হয় তা যুক্ত করে -v। (আমি জিসিসির
প্রিপ্রোসেসরটির

@ র্যামহাউন্ড এটি অবশ্যই নীচে পুনরাবৃত্তভাবে অনুসন্ধান করে না/usr/include । এটি বিশ্বের প্রায় প্রতিটি সি লাইব্রেরি ভাঙবে।
zwol

উত্তর:


12

ছোট উত্তর।

আপনার প্রশ্নটি আউটপুট সম্পর্কে cc1 -v, তবে এটি সিপিপিতে (সি প্রি-প্রসেসর) ফ্যাক্টর করে না এবং এতে সম্পূর্ণ সংকলন শৃঙ্খলে মিশ্রিত রয়েছে। যদি আপনি cpp -vআপনার সিস্টেমে চালিত হন তবে আপনার দেখতে পাওয়া উচিত, এর মিশ্রণ অন্তর্ভুক্ত যা এর আউটপুটের cc1 -vসাথে অনুরূপ তবে সেখানে অন্ততপক্ষে যুক্ত হওয়া /usr/include/x86_64-linux-gnuপথের সাথে মিল রয়েছে।

দীর্ঘ উত্তর।

যেহেতু /usr/include/x86_64-linux-gnu/প্রথম আউটপুটে অন্তর্ভুক্ত নেই, জিসিসি কীভাবে খুঁজে পাবে sys/ptrace.h?

প্রযুক্তিগতভাবে, /usr/include/x86_64-linux-gnu/স্পষ্টভাবে প্রথম আউটপুট সেট করা হয় না, তবে /usr/include/অবশ্যই। এবং এটি একটি ডিফল্ট অনুসন্ধানের পথ যা সরকারী জিএনইউ জিসিসি ডকুমেন্টেশনে বর্ণিত হয়েছে :

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

  • , / Usr / স্থানীয় / অন্তর্ভুক্ত
  • libdir / জিসিসি / লক্ষ্য / সংস্করণ / অন্তর্ভুক্ত
  • , / Usr / লক্ষ্য / অন্তর্ভুক্ত
  • , / Usr / অন্তর্ভুক্ত

এবং আরও এখানে ব্যাখ্যা:

জিসিসি #include "file"বর্তমান ফাইল যুক্ত ডিরেক্টরিতে প্রথমে অনুরোধ করা শিরোনাম সন্ধান করে, তারপরে ডিরেক্টরিতে -iquoteবিকল্পগুলির দ্বারা উল্লিখিত ডিরেক্টরিগুলির পরে, একই স্থানে এটি কোণ বন্ধনী সহ অনুরোধ করা শিরোনাম সন্ধান করবে। উদাহরণস্বরূপ, যদি /usr/include/sys/stat.h# টি থাকে তবে include "types.h"জিসিসি types.hপ্রথমে সন্ধান করে এবং /usr/include/sysতারপরে তার স্বাভাবিক অনুসন্ধানের পথে।

সুতরাং এটি সূচিত করে যে x86_64-linux-gnu/পথটি সহজেই এইভাবে প্রবেশ করানো হয়েছে /usr/include/*/sys/:

/usr/include/x86_64-linux-gnu/sys/ptrace.h

কমপক্ষে এটিই আমি প্রথমে এই প্রশ্নের পূর্ববর্তী সংস্করণে ভেবেছিলাম । তবে এই সাইটটি যাচাই করার পরে যা ঘটছে তার ব্যাখ্যাটি কিছুটা বিশদভাবে এবং সেই সাইটটি থেকে আমি উপরে যা পোস্ট করেছি তার সমতুল্য সামগ্রীর প্রত্যক্ষ প্রতিক্রিয়াটি নীচে পুনরায় পোস্ট করা হয়েছে; গা bold় জোর আমার:

তবে এটি এক ধরণের উত্তর-ধোয়া উত্তর (এবং অসম্পূর্ণও)। অবশ্যই এটি অবশ্যই এটির হেডার ফাইলগুলি সন্ধান করতে শেষ করতে চলেছে তা আপনাকে জানাতে জিসিসির পাওয়ার একটি উপায় অবশ্যই রয়েছে? ওয়েল, যদিও এটি জিসিসিকে একক একক একাধিক অ্যাপ্লিকেশন হিসাবে মনে করা সুবিধাজনক যা উত্স কোড ফাইলগুলি গ্রহণ করে এবং কার্যকরী প্রোগ্রামগুলি ছড়িয়ে দেয়, এটি প্রযুক্তিগতভাবে অন্যান্য প্রোগ্রামগুলির একটি সংগ্রহ যা চূড়ান্ত সংকলিত অবজেক্ট ফাইল তৈরি করার জন্য একসাথে চেইন হয়। এর মধ্যে প্রথমটি সিপিপি, সি প্রি-প্রসেসরের জন্য সংক্ষিপ্ত , যার কাজ হ'ল সংকলক নির্দেশকের মতো সন্ধান করা #includeএবং তাদের দ্বারা নির্দিষ্ট করা উত্স কোডটি সংশোধন করা; অন্তর্ভুক্তির ক্ষেত্রে, বর্তমান ফাইলটিতে অন্য কোনও ফাইলের বিষয়বস্তু অনুলিপি করে। -ভি পতাকাটি পেরিয়ে আপনি এই ফাইলগুলি কোথায় দেখছেন তা দেখতে পাবেন:

জেনে রাখুন যে সিপিপি (সি প্রসেসর) cpp -vসংকলকটির প্রক্রিয়ার প্রথম পদক্ষেপ, আসুন আমার উবুন্টু 12.04.5 টেস্টিং সিস্টেমের "অন্তর্ভুক্ত" আউটপুটটি দেখুন :

#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/4.6/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/4.6/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include

সেখানে আপনি পরিষ্কার দেখতে পারেন /usr/include/x86_64-linux-gnu। এবং তুলনা করতে, এখানে /usr/lib/gcc/x86_64-linux-gnu/4.6/cc1 -vএকই উবুন্টু 12.04.5 টেস্টিং সিস্টেমে অনুরূপ "অন্তর্ভুক্ত" আউটপুট রয়েছে :

#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/4.6/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/4.6/include-fixed
 /usr/include

/usr/include/x86_64-linux-gnuপ্রাথমিক সিপিপি (সি প্রসেসর) ক্রিয়াকলাপের মাধ্যমে মিশ্রণে কীভাবে স্পষ্টভাবে সন্নিবেশ করা হয়েছে তা নোট করুন । এবং সেই সাইটের পোস্টটি আরও জানায় যে সেই পথগুলি কোথা থেকে এসেছে; আবার সাহসী জোর আমার:

সংকলনের সময় এই পাথটি আসলে সিপিপিতে (যা জিসিসির অংশ) অন্তর্নির্মিত; যদি কোনও কারণে আপনি সেই ডিরেক্টরিগুলির মধ্যে একটি মুছতে শেষ করেন তবে এটি প্রতিটি সংকলনের জন্য এখনও পরীক্ষা করা হবে। প্রতিটি ডিরেক্টরি এটি এখানে তালিকাভুক্ত ক্রমে অনুসন্ধান করা হয়; যদি কোনও ফাইল পাওয়া যায় /usr/local/includeতবে পরবর্তী তিনটি ডিরেক্টরি পরীক্ষা করা হবে না।

সুতরাং এটি সমস্ত সিপিপি (সি প্রসেসর) কে সি সংকলন শৃঙ্খলার প্রথম অংশ হিসাবে ডাকা হ'ল।


কেন x86_64-linux-gnu / মাঝখানে shoved হয়?
ব্যবহারকারী 912083132

@ ব্যবহারকারী912083132: $TARGETআমি আমার উত্তর এবং মন্তব্যে এই অংশটি উল্লেখ করেছি। এটি config.guessকখন জিসিসি সংকলিত হয়েছিল তার ফলাফল , বা যা এর configureস্ক্রিপ্টকে --targetপতাকা সহ দেওয়া হয়েছিল । আসল প্রশ্নটি হল, সেই পথটি কীভাবে একত্রিত হয়? শিরোনামটি $TARGETপ্রথমবারের মধ্যে খুঁজে পেতে ব্যর্থ হওয়ার পরে , এটি কি কেবল একই তালিকার মধ্য দিয়ে ফিরে যায়?
ওয়ারেন ইয়ং

@ ব্যবহারকারী912083132 কিছু নতুন সজ্জিত তথ্য সহ আমার উত্তর আপডেট করেছে। দয়া করে এটি পুনরায় পড়ুন; উত্তরটি সিপিপি (সি প্রি-প্রসেসর) থেকে এসেছে তা ব্যাখ্যা করে।
জেকগল্ড

2

জিসিসির উত্স কোডটি আবিষ্কারের সংক্ষিপ্ততা, আমি আপনাকে একটি "কেন" দিতে পারি না, তবে আমি আপনাকে বলতে পারি যে আমার এখানে উপস্থিত জিসিসির সংস্করণটি /usr/include/$TARGETআপনি এবং জ্যাকগলডের পছন্দগুলি নিখুঁত করার পরে ফিরে আসবে । আপনি এটি দেখতে পারেন:

$ strace -f -e open gcc -c foo.c -o foo.o 2>&1 | grep ptrace.h

যেখানে foo.c#include <sys/ptrace.h>

আপনার -fএখানে যুক্তি দরকার কারণ gccবাচ্চাদের প্রকৃত সংকলনের কাজ করতে উত্সাহ দেওয়া হয়। আপনার দরকার 2>&1কারণ straceএর ফলাফলগুলি স্ট্যাডারে লিখছে, স্টাডাউট নয়।

ENOENTনথিভুক্ত ডিরেক্টরিগুলি শেষ পর্যন্ত সফল হওয়ার চেষ্টা করার আগে আপনি সমস্ত ত্রুটি পেয়েছেন তা লক্ষ্য করুন ।

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