سؤال

في تطبيق VCL جديد ترجمة و يبني تنتج العملية نفس الملف الثنائي والخرائط (مع وجود اختلافات بسيطة في نهاية ملف .exe حتى لو تم إيقاف تشغيل خيار "تشمل معلومات الإصدار في المشروع" - تمت مناقشته بالفعل). ملف الخريطة هو نفس بايت بايت. لكن WEN I أضف أي مكونات طرف ثنائي والخريطة (!) للخريطة (!) التي تنتجها Build and Compile مختلفة بشكل كبير!

اختبارها على نسختين من دلفي:
- الإصدار 7.0 (بناء 8.1)
- CodeGear ™ Rad Studio 2007 الإصدار 11.0.2902.10471 (+ ديسمبر 2007) التحديث)

خطوة إلى إعادة التكاثر:

  1. إنشاء تطبيق VCL جديد. ربما أضف أي مكون Delphi الأصلي (أحاول جميع المكونات من علامة التبويب Standart والإضافة أو الإضافية و Win32 والنظام).
  2. قم بتشغيل ملف خريطة مفصل على علامة التبويب رابط لخيارات المشروع.
  3. بناء المشروع.
  4. إعادة تسمية الملفات. exe و .map (على سبيل المثال: project1.exe إلى project1b.exe و project1.map إلى project1b.map).
  5. مشروع ترجمة.
  6. إعادة تسمية إخراج ملف .exe و .map (على سبيل المثال: project1.exe إلى project1c.exe و project1.map إلى project1c.map).
  7. مقارنة الملفات من الخطوة 4 و 6. (أستخدم WinMerge 2.12.4.0).

لدينا بعض الملفات المختلفة. exe وملفات .map متطابقة تماما. ثم إذا كررنا جميع الخطوات مرة أخرى ولكن استخدام مكونات الطرف الثالث للمشروع (أحاول ODAC و DOA و Devexpress ونفسه) نحصل على المزيد من ملفات .EXE ومختلف.

لماذا ا؟ أي اقتراحات؟

تحديث
بعض المعلومات حول كيفية وجدت هذا ولماذا يهمني:
مشروع يبني من برنامج نصي بسيط مع MSBUILD. عند إضافة في المشروع ترجمة من خلال ENTE (DLL مع الموارد)، وجدت أنه عند إنشاء المشروع (من البرنامج النصي أو من IDE) - النسخة المترجمة تعمل بشكل خاطئ - بعض النص على زر، التسميات وما إلى ذلك حصلت من مكان خاطئ (حرفيا من آخر زر، ملصقات). عندما تم تجميع المشروع من IDE - كل شيء على ما يرام. لذلك أبدأ مقارنة إنتاج البناء وتجميع ...

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

المحلول

ما تراه هو ببساطة قطعة أثرية من المنطق المدمج في المترجم. عندما تقوم ببناء، فإنه يروي المحول البرمجي لبناء جميع المصادر المتاحة. لذلك تقوم Delphi بمعالجة كل ملف مصدر ولكل وحدة في قوائم الاستخدامات التي يجد مصدرها، ثم سيتم إنشاء ذلك الملف بعد ذلك. يفعل هذا بشكل متكرر. عند إجراء ترجمة، يتم تحميل ملفات .dcu الموجودة فقط وإذا وجدت أن تكون محدثة، فلا شيء يتم. يمكن أن يؤدي ذلك بالفعل إلى طلب مختلف يتم فيه اكتشاف الوحدات لأن كل .DCU ستقوم بفعالية "تسطيح" قائمة الاستخدامات. نظرا لأن الوحدات يتم اكتشافها وتحميلها بترتيب مختلف، فهي بدورها، مرتبطة بترتيب مختلف. هذا هو السبب في أن ملفات الخريطة الخاصة بك تبدو مختلفة جدا. بالنظر إلى نفس المصادر، يجب أن يكون ملف الخريطة هو نفسه إذا قمت بتبني اثنين في صف أو اثنين من التجمعات على التوالي.

هناك أسباب أخرى للخلافات أكثر ديونا وتشمل أشياء مثل ختم وقت رأس PE، وغيرها من البتات من الحشو والمحاذاة.

نصائح أخرى

هناك جزأان لهذه الإجابة وأعتقد ذلك.

جزء من مشكلة المشاهدة الخاصة بك، IIRC، هو أن المحول البرمجي لا يخرج الذاكرة قبل القيام بتجميع / بناء. وبالتالي فإن أي شيء يتبقى في الذاكرة غير المهيمية يصبح حشو في إخراج أغراض المحاذاة.

يبدو أنني أذكر أن هناك ختم وقتا زمنيا مدرجا في معلومات رأس PE للتطبيق. هذا سوف يسبب فرقا في كل مرة.

أنا لست أفضل شخص لتأكيد هذا ولكن هذا ما يبدو لي أن أذكر من المناقشات الماضية.

من المحتمل أن يكون الأشخاص مثل Allen Bauer أو Barry Kelly قادرين على إعطاء معلومات أفضل / أكثر دقة حول هذا الموضوع.

إذا كنت تستخدم برنامج التحويل البرمجي يحدد في مشروعك وتغييره فقط، إذا قمت بإجراء ترجمة، فلن ترى أي تغييرات في وحدة DCU والوحدة الناتجة الناتجة (EXE أو DLL). إذا قمت بإعادة بناء كاملة، فسيتم استخدام المحول البرمجي في وحدات DCU التي تم إنشاؤها حديثا.

لقد رأيت هذا في مجموعة مشاريع كبيرة حيث نستخدم الوحدات النمطية في مشاريع مختلفة مع تحديد مختلف ويتم تخزين جميع DCU في نفس الدليل.

Ergo: برنامج التحويل البرمجي لا يفرض التداول على تحديد في هذه الحالة.

ربما ترى نفس المشكلة.

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