هل هناك طريقة لتحديد أي إصدار من Visual Studio كان يستخدم لتجميع مكتبة ثابتة؟

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

سؤال

ولدي مجموعة من مكتبات ثابت (.LIB) ملفات واحد منها قد تم بناؤها مع إصدار مختلف من Visual Studio. هذا يسبب رمز جيل من المشروع الذي يربط ضد كل من لهم الفشل. هل هناك أي طريقة لتحديد أي إصدار من Visual Studio كان يستخدم لتجميع مكتبة ثابتة؟

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

المحلول

لمكتبات الإفراج عنهم، فمن غير المرجح أن تستطيع تحديد إصدار.

لمكتبات التصحيح، يمكنك استخدام <لأ href = "https://docs.microsoft.com/en-us/cpp/build/reference/dumpbin-reference؟view=vs-2017" يختلط = "نوفولو noreferrer "> DUMPBIN :

dumpbin /rawdata:1 library.lib

ويجب أن يكون التجمع واضحا في بداية تفريغ وسيحتوي الإصدار من CRT تتطلب المكتبة جنبا إلى جنب مع المسار الكامل إلى مترجم تستخدم لبناء المكتبة.

لالتنفيذية ودلس يمكنك الحصول على نسخة رابط باستخدام DUMPBIN. انها تحت عنوان "قيم الرأس اختياري"

dumpbin /headers program.exe

وربما شخص آخر يعرف من وسيلة للحصول على نسخة للمكتبات الإطلاق؛ أنا مهتم بالتأكيد أيضا إذا هم.

نصائح أخرى

ولقد استعملت دائما شيء من هذا القبيل (في إطار سيغوين):

strings -f *.lib | grep 'Visual Studio'

والمترجم العصي مسار المترجم في المكتبة على التصحيح يبني والمكان مترجم الافتراضية البصرية ستوديو هو تحت مسار يتضمن النص "البصرية ستوديو".

وهكذا، مثل جيمس McNellis "الجواب، وهذا يعمل أيضا فقط لتصحيح يبني وهو مزيد من تقييد ليبني يستخدم في الواقع المترجم الذي يجلس في دليل مع 'البصرية ستوديو <م> # ' في مسار .

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

وهذا له فائدة أنه من السهل أن نتذكر إذا كنت معتادا على أدوات سطر الأوامر يونكس.

إذا كان لديك ملفات .PDB المقابلة ثم يمكنك ان ترى إصدار مترجم من هناك مع أداة مثل <وأ href = "http://www.codeproject.com/Articles/37456/How-To-Inspect -The-المحتوى من واحد في برنامج قاعدة بيانات-P "يختلط =" noreferrer "> فوسفات المفتش .

وأو فتح PDB في المشاهد عرافة والبحث عن السلسلة "مايكروسوفت (R) أمثلية البرمجي". فإن النسخة يكون في أربع قيم عرافة 2 بايت فقط قبل هذه السلسلة، كما في هذا المثال:

000000A060: .. .. .. .. .. .. . ...  .. .. .. .. .. .. 13 00                ..
000000A070: 00 00 6E 5D 00 00 4D 69  63 72 6F 73 6F 66 74 20  ......Microsoft
000000A080: 28 52 29 20 4F 70 74 69  6D 69 7A 69 6E 67 20 43  (R) Optimizing C
000000A090: 6F 6D 70 69 6C 65 72 00  .. .. .. .. .. .. .. ..  ompiler ........

وهذا الإصدار هو بالتالي HEX 13 00، 00 00، 6E 5D، 00 00، أو 19.0.23918.0.

إذا تم كتابة مكتبة ثابتة في C ++، وبنيت مع MSVC 2010 أو إصدار أحدث، قد وضعت توجيها FAILIFMISMATCH التي كتبها المترجم في ملفات الكائن.

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

ويمكنك استخدام الأمر التالي لطباعة هذه التوجيهات من مكتبة ثابتة:

find "FAILIFMISMATCH" xyz.lib

و(أو استخدام الطريق وقد ذكر أن mheyman إذا كنت تفضل في سيغوين أو MSYS)

وربما تكون النتيجة مشابهة لهذه:

0@   /FAILIFMISMATCH:"_MSC_VER=1900" /FAILIFMISMATCH:"_ITERATOR_DEBUG_LEVEL=0" /FAILIFMISMATCH:"RuntimeLibrary=MD_DynamicRelease" /DEFAULTLIB:"msvcprt" /FAILIFMISMATCH:"_CRT_STDIO_ISO_WIDE_SPECIFIERS=0" /DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"MSVCRT" /DEFAULTLIB:"OLDNAMES"

ملاحظة أول التوجيه: "_MSC_VER = NNNN". في ملاحظتي، وNNNN هو تطابق دائما إلى إصدار مترجم المستخدمة لإنشاء ملف الكائن. في حالتي، كان xyz.lib خلق مع MSVC 2015 تحديث 3، في C ++ الإصدار المترجم هو 19.00.24215، لذلك وضع / FAILIFMISMATCH: "_ MSC_VER = 1900" في ملف الكائن

ورسم الخرائط التفاصيل بين Visual ستوديو نسخة وإصدار Microsoft C / C ++ مترجم يمكن العثور على في هنا .

وأنت لم يحدد اللغة، ولكن في C # الجواب لمعرفة OS والإصدار. NET (في التعليمات البرمجية في وقت التشغيل) هو:

System.Version osVersion = System.Environment.OSVersion;
System.Version cliVersion = System.Environment.Version;

وسيكون هناك ما يعادلها في إدارتها C ++ / CLI

وهذا لن اقول لكم verison من على مترجم أو من على IDE ، لكن سوف اقول لكم verison من أوقات التشغيل .NET. قد أو قد لا تحتاج إلى معرفة إصدار نظام التشغيل.

و-Jesse

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