القضاء على مشكلة عدم التوافق بين المترجم مع المكتبات الديناميكية C ++

StackOverflow https://stackoverflow.com/questions/956310

سؤال

...، متابعة هذه.

من الإجابات التي أعطيتها لسؤالي المشار إليه الذي تعلمته بما يلي:

  • المترجمات المختلفة تستخدم ديكور اسم مختلف، مما يجعل من المستحيل استخدام مكتبة ديناميكية C ++ التي تم إنشاؤها مع برنامج التحويل البرمجي A في مشروع بنيت مع مترجم B،
  • يمكن بناء المكتبة كقاعدة ثابتة لإنقاذي بما في ذلك Header Header وملفات المصدر في المشروع أو تصدير الرموز. (لا يزال لن ينقذ إعادة بناء المكتبة للاستخدام مع مترجم مختلف.)

إن إلقاء نظرة فاحصة على SDL في ضوء ما قيل، لقد أدركت، أن ربطه يحتوي على طبقتين: في مشروع SDL الخاص بي، أربط بشكل ثابت ضد LIBSDL.A، والتي سوف، بدورها، رابط ديناميكيا ضد SDL. DLL، وبالتالي تجميع الحاجة إصدارات مختلفة من .dll للمجمعات التحويلية المختلفة.

والسؤال هو ما إذا كان هذا هو الحال حقا وحل قابل للتطبيق للمشكلة، أو أنا أفتقد شيئا (وماذا)؟

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

المحلول

أعتقد أن نهجك صحيح. سأضعه بهذه الطريقة:

  • بالنسبة إلى DLL لتكون قابلة للاستخدام من قبل مترجمات محكمات مختلفة، يجب أن تحتوي على وظائف C فقط (يمكن تجميعها باستخدام مترجم C ++ باستخدام extern C)
  • كالعادة مع DLLS، يمكن استخدام مكتبة الاستيراد الثابتة بحيث يمكن استدعاء الوظائف الموجودة في DLL مباشرة، بدلا من الحاجة إلى تحميلها بالاسم
  • بدلا من مكتبة الاستيراد العادية، يمكنك الحصول على مكتبة مجمع يلتف وظائف C DLL في فئات C ++ ووظائفها
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top