سؤال

هل هناك طريقة لإنشاء ملف رأس C ++ لملف .OBJ؟ أو ربما يكون هناك أداة يمكن عرض ملفات .OBJ. لقد وجدت بالفعل OBJCONV التي تتحول بين التنسيقات ، لكن لا يمكنني العثور على أي مولد/عارض .H.

هل كانت مفيدة؟

المحلول

بالنظر إلى علامة C ++ ، فإن الموقف ليس ميئوسًا منه كما يعني بعض الإجابات الأخرى.

على وجه الخصوص ، على الأقل مع معظم مجمعي C ++ ، سيتم تشويه اسم الوظيفة (تسميها Microsoft "مزينة") للإشارة إلى المعلمات التي اتخذتها تلك الوظيفة. يختلف مخطط mangling من مترجم إلى آخر ، ولكن أيًا منهم يرمز بشكل أساسي معلومات كافية لإعادة إنشاء إعلان للوظيفة-نوع الإرجاع ، اسم الوظيفة نفسها ، اسم الفصل إذا كان وظيفة عضو والرقم الدقيق ونوع المعلمات التي تتوقعها الوظيفة.

على الرغم من أنه لن يتم القيام به عن طريق تشغيل الاسم ، إلا أن نظام C ++ ليس له خيار حقيقي سوى تضمين معلومات المعلمة في ملف الكائن. عندما تقوم بالوظائف الزائدة ، يحتاج الرابط إلى طريقة لفرز الحمل الزائد للربط بمكالمة معينة.

يجب أن أضيف أن الفرز هذا قد يكون جزءًا كبيرًا من العمل - على سبيل المثال ، إذا كان الرمز يتضمن قوالب ، فسيتم توسيع اسم الرمز في ملف الكائن الكل معلمات القالب (بما في ذلك المعلمات الافتراضية). على سبيل المثال فقط ، فكر في جزء تافهة من الكود مثل هذا:

#include <vector>
#include <string>

std::vector<std::string> x;

عندما أقوم بتجميع هذا مع VC ++ ، ثم أفعل dumpbin /symbols foo.obj, ، الإخراج حوالي 75 كيلوبايت. على الرغم من أن رمز المصدر الخاص بي يظهر فقط أنه يحدد رمزًا واحدًا ، إلا أن ملف الكائن يحتوي على تعريفات لحوالي 180 رمزًا ، إلا أن العديد منها لا علاقة له تمامًا بأي شيء كتبته على الإطلاق.

تجدر الإشارة أيضًا إلى أنه إذا تم تجميع ملف الكائن بمعلومات تصحيح الأخطاء ، فإن ذلك سينتج (عادةً) معلومات أكثر إلى حد كبير (وكذا) في ملف الكائن أيضًا.

نصائح أخرى

تم وضع علامة على سؤالك مع visual-c++ لذلك أفترض أنك على Windows.

لا يمكن إنشاء ملفات الرأس الأصلية من ملفات الكائنات ، حيث يتم إسقاط الكثير (يمكن القول أكثر) من المعلومات في ملفات الرأس أثناء تجميع الكود المصدر في ملفات الكائن.

ومع ذلك ، يمكنك استخدام dumpbin فائدة لفحص ملفات الكائنات على مستوى منخفض للغاية. المعلومات الوحيدة الموجودة في ملف كائن قد تكون مثيرة للاهتمام بالنسبة لك هي قائمة أسماء الرموز التي يتم تعريفها في ملف الكائن المحدد. لا يمكنك الحصول على أي معلومات من ملف الكائن. لذلك لا يمكنك معرفة نوع القيمة التي تأخذها وظيفة معينة أو تتوقعها.

في بعض المواقف (عندما يتم تمرير جميع الوسائط إلى الوظيفة عبر المكدس) ، يمكنك معرفة عدد الوسائط التي تتوقعها الوظيفة (عن طريق تفكيك بداية رمز الوظيفة وحساب عدد القيم التي تم عرضها من المكدس). هذا لن يعمل في الغالبية العظمى من الحالات رغم ذلك.

لا يمكن أن يكون هناك مولد رأس ، لأن ملف .OBJ لا يحتوي على جميع المعلومات التي ستكون ضرورية في ملف الرأس. أما بالنسبة لإلقاء .OBJ ، فإن الأدوات اللازمة للقيام بذلك تعتمد على المترجم. الأداة المتعلقة بـ GCC للقيام بذلك objdump.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top