سؤال

أقول أن لدي ثابت c ++ lib، static.lib وأريد استدعاء بعض الوظائف من ليب مشترك C ++، كما يقول Shared.lib. هل هو ممكن؟

افترض الآن أن لدي ليب مشترك آخر، ويقول Shared2.lib الذي روابط ثابتة. LIB ولكن لا يربط Shared.lib. هل يربط الرابط تلقائيا Shared2.lib إلى Shared.lib في هذه الحالة؟

أنا أستخدم Microsoft Visual Studio 2003.

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

المحلول

لا ترتبط المكتبات الثابتة. إنهم مجرد مجموعة من ملفات الكائنات (* .obj أو * .o) التي يتم أرشفة معا في ملف مكتبة (نوع من ملف القطران / الرمز البريدي) لتسهيل ذلك في العثور على الرموز التي يحتاجها الرموز التي يحتاجها.

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

إذا كنت ترغب في الرابط لربط المكتبات الأخرى تلقائيا، فستعمل اقتراح ستيفن ويتم استخدامه بواسطة مكتبات ذات سمعة طيبة مثل Boost و Stlport. للقيام بذلك، ضع Pragma في ملف الرأس الرئيسي للمكتبة الثابتة. يجب أن تشمل المكتبة الثابتة ومعالينها.

ومع ذلك، فإن هذه الميزة تعني هذه الميزة حقا لمكتبة المكتبات، حيث توجد المكتبة في مسار مكتبة النظام، بحيث ستجد ذلك الرابط بسهولة. أيضا في حالة التعزيز و STLPort يستخدمون هذه الميزة لدعم نسخة متعددة من نفس المكتبات مع خيارات محددة #defineتتطلب خيارات مختلفة إصدارات مختلفة من المكتبة المراد ربطها. هذا يعني أن المستخدمين أقل عرضة لتكوين زيادة بطريقة أو بأخرى مع مكتبة تكوينها آخر.

تفضيلي للحصول على رمز التطبيق هو ربط الأجزاء المطلوبة بشكل صريح.

نصائح أخرى

لن يحقق الرابط تلقائيا المكتبات الأخرى، ولكن يمكنك استخدامه #pragma التعليق (ليب، "static.lib") لتبسيط عملية ربط الملفات الإضافية بإضافة Pragma إلى ملفات رأسك.

أقول أن لدي ثابت c ++ lib، static.lib وأريد استدعاء بعض الوظائف من ليب مشترك C ++، كما يقول Shared.lib. هل هو ممكن؟

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

افترض الآن أن لدي ليب مشترك آخر، ويقول Shared2.lib الذي روابط ثابتة. LIB ولكن لا يربط Shared.lib. هل يربط الرابط تلقائيا Shared2.lib إلى Shared.lib في هذه الحالة؟

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

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