كيف يمكنني إجبار MSVC ++ على تجاهل تبعيات CRT لمكتبة ثابتة؟

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

سؤال

لا أعرف ما إذا كان من الممكن القيام بذلك ، لكنني أرغب في تطبيق /nodefaultlib على مشروع مكتبة ثابتة.

لدي العديد من مشاريع التطبيقات (A.Exe ، B.DLL ، C.DLL) التي تستخدم مكتبة ثابتة مشتركة D.Lib. تحتوي هذه المكتبة على الكثير من التعليمات البرمجية ولديها أيضًا تبعيات أخرى. أحدها هو مكتبة OpenSSL ، التي يبدو أنها تم بناؤها لـ Win32 مقابل إصدار الإصدار من CRT (ليس لدي المشروع/المصادر الأصلية).

حتى الآن ، لتجنب خلط إصدارات الإصدار /التصحيح من CRT ، لا بد لي من وضع /نودفولتليب: svvcrt.lib توجيه الرابط في جميع مشاريع الأوراق (A.Exe ، B.DLL). هذا يعمل ، لكنني أعتقد أنها ليست الطريقة المثالية للتعامل مع هذه القضية. حاولت وضع هذه الخاصية في مشروع D.Lib ، لكن ليس له أي تأثير.

هل هناك طريقة لإجبار MSVC ++ على تجاهل الاعتماد على MSVCRT.LIB من مكتبة الطرف الثالث؟

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

المحلول

لا يحتوي A .lib على أي إعدادات رابط لأنك لا تربطها ، يمكنك الارتباط إلى هو - هي. A .lib هو مجرد أرشيف من ملفات .OBJ ، مثل ملف .zip غير مضغوط - ولهذا السبب عليك وضع الإعداد على جميع المشاريع التي ترتبط بها.

إذا كنت تستخدم VS2005+ ، فيمكنك استخدام أوراق الخصائص بحيث يتعين عليك فقط وضع الإعداد في مكان واحد ثم استخدام ورقة الخصائص هذه في جميع المشاريع.

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

إذا فشل ذلك ، فلديك دائمًا خيار رفع وظيفتك إلى DLL منفصل بحيث يكون لديك مشكلات فقط مع مشروع واحد.

نصائح أخرى

أفهم أنه إذا تم ربط المكتبة بشكل ثابت في DLL ، فإن DLL يحتوي بالفعل على جميع التعليمات البرمجية ذات الصلة من LIB. لذلك ، لا يمكن إزالة هذا الاقتران. هذا يعتمد فقط على فهمي للربط الإحصائي ، وليس على التجارب.

لمنع مكتبة الارتباطات الثابتة الموزعة من الاعتماد على مكتبة وقت تشغيل MSVC محددة ، تحتاج إلى تعيين خيار المترجم هذا (في Visual Studio 2010 يبدو):

خصائص التكوين -> C/C ++ -> متقدم -> حذف اسم المكتبة الافتراضي = نعم (/ZI)

الآن يمكن للمستخدمين الارتباط بإصدارك المصنوع من LIB ثابت من بناء تصحيح الأخطاء الخاصة بهم وعدم محاولة الارتباط بمكتبة وقت التشغيل غير الصحيحة التي تسبب مشاكل ، وكذلك تحذيرات الروابط.

لاحظ أنه قد يتسبب في أخطاء الارتباط إذا كانت مكتبتك تعتمد فعليًا على مكتبة وقت تشغيل محددة أو سلوكها ، ولا يتم توفير المكونات المتوافقة بطريقة أخرى.

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