سؤال

أقوم بإنشاء برنامج C ++ ، لكنني أريد أن أكون قادرًا على تقديم ملف .exe فقط للمستخدم. ومع ذلك ، أنا أستخدم المكتبات (حليقة من بين أمور أخرى) التي لديها بعض DLL. هل من الممكن تجميع هذه DLL في ملف .exe؟

يمكنني استخدام الرمز :: الكتل و mingw.

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

المحلول

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

أعتقد أن ما قد تريده حقًا هو المثبت الذي يثبت قابلة للتنفيذ وجميع المكتبات المعتمدة.

نصائح أخرى

هناك مقال في DDJ من عام 2002 قد يكون له ما تريد:

يستخدم بشكل أساسي مزيجًا من الارتباط بـ DLL باستخدام ميزة MSVC "المتأخرة" وتعبئة DLL كمورد مضمن في EXE. ثم يتم استخراج DLL تلقائيًا في وقت التشغيل عند إجراء المكالمة الأولى إلى أحد الصادرات.

لم أستخدم هذه التقنية ، لذا لا يمكنني التعليق حقًا على مدى نجاحها ، لكن من المؤكد أنها تبدو فكرة بقعة.

يمكنك استخدام ilmerge

جئت عبر dll2lib فائدة مرة واحدة. قطعة مثيرة للاهتمام ، على الرغم من الثمن واحد. يتيح لك تحويل أي DLL تقريبًا إلى مكتبة ثابتة ، والتي قد يتم ربطها لاحقًا بتطبيقك لإنتاج EXE الصلبة. IIRC ، سوف يعرض الإصدار المجاني بعض الإخطار (MessageBox) عند إدخال وظيفة من هذه المكتبة التي تم إنشاؤها.

أنت بحاجة إلى بعض أدوات Packer الخاصة مثل Xbundler.

إذا كنت بحاجة حقًا إلى تحقيق ذلك ، فيمكنك استخدام هذه المكتبة الرائعة التي ستسمح لك بتحميل DLL من الذاكرة. لقد استخدمته لقراءة DLL من مورد وتحميله لي.

https://github.com/fancycode/memorymodule

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

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