Soru Visual Studio'nun hangi sürümünün statik kitaplığı derlemek için kullanıldığını belirlemenin bir yolu var mı?


Visual Studio'nun farklı bir sürümü ile oluşturulmuş bir statik kütüphane (.lib) dosyası koleksiyonum var. Bu, hepsine karşı bağlantı kuracak bir projenin kod oluşturulmasına neden oluyor. Visual Studio'nun hangi sürümünün statik kitaplığı derlemek için kullanıldığını belirlemenin bir yolu var mı?


21
2017-09-11 16:07


Menşei


Sormak için daha iyi bir soru, derleyicinin hangi sürümü. Visual Studio'nun kullanımı olmadan C ++ statik libs derlemek mümkün. - JaredPar
Yeterince adil. Benim özel durumumda hepsi derlenmiş bazı Visual Studio'nun sürümü. Yine de gizlenen daha genel bir soru var. - Bill Carey


Cevaplar:


Sürüm kitaplıkları için, sürümü belirleyebileceğiniz olası değildir.

Hata ayıklama kitaplıkları için kullanabilirsiniz dumpbin:

dumpbin /rawdata:1 library.lib

Derleme bildirimi, dökümün başlangıcında olmalı ve kitaplığın oluşturulmasında kullanılan derleyicinin tam yolunun yanı sıra kitaplığın gerektirdiği CRT sürümünü içerecektir.

Yürütülebilir dosyalar ve DLL'ler için linker versiyonunu dumpbin kullanarak alabilirsiniz; "OPSİYONEL HEADER DEĞERLERİ" altında

dumpbin /headers program.exe

Belki de başka biri sürüm kütüphaneleri için bir sürüm elde etmenin bir yolunu bilir; Onlar da kesinlikle ilgilenirim.


22
2017-10-09 01:46



Bu aracı nerede bulacağınız veya Visual Studio yüklemesiyle varsayılan olarak bulunamayacağımız yer ve sonra nereden alabileceğimiz hakkında bazı ayrıntıları paylaşır mısınız? - SUMIT KUMAR SINGH
Değil mi dumpbin /headers program.exe-approach ayrıca sürüm ikili dosyaları ile çalışır? Ben denedim ve işe yaradı. - stackoverflowwww


Her zaman bir şey kullandım (bir cygwin penceresinde):

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

Derleyici, derleyicinin hata ayıklama derlemelerindeki yolunu derler ve Visual Studio'nun derleyici varsayılan konumu 'Visual Studio' metnini içeren bir yol altındadır.

Yani, James McNellis'in 'cevabı gibi, bu da sadece hata ayıklama yapıları için çalışıyor ve' Visual Studio ile bir dizinde oturan bir derleyiciyi kullanan yapılarla daha da kısıtlanıyor. #' yolda.

Bu yöntemi yıllar önce biraz tesadüfen buldum ve başarısızlığa uğradım.

Bu, Unix komut satırı araçlarına aşina olup olmadığını hatırlamanın kolay olduğu yararına sahiptir.


7
2018-06-06 19:10





Eğer ilgili .PDB dosyalarınız varsa, o zaman derleyicinin sürümünü oradaki gibi bir araçla görebilirsiniz. Pdb Müfettiş.

Veya PDB'yi bir hex görüntüleyicide açın ve "Microsoft (R) Optimize Compiler" dizesini arayın. Sürüm, bu örnekte olduğu gibi, bu dizeden hemen önce dört adet 2 baytlık onaltılık değerde olacaktır:

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 ........

Versiyon, HEX 13 00, 00 00, 6E 5D, 00 00 veya 19.0.23918.0'tır.


3
2018-05-19 08:45





Statik kütüphane C ++ ile yazılmış ve MSVC 2010 veya daha yeni bir sürümle oluşturulmuşsa, derleyici tarafından nesne dosyalarına bir FAILIFMISMATCH yönergesi koyulmuş olabilir.

Microsoft'tan FAILIFMISMATCH yönergesiyle ilgili resmi belgeyi bulamıyorum, ancak C ++ standart kitaplık sürümleri arasındaki uyumsuzlukları tespit etmek için bağlayıcı tarafından kullanılıyor gibi görünüyor.

Bu yönergeleri statik kitaplıktan yazdırmak için aşağıdaki komutu kullanabilirsiniz:

find "FAILIFMISMATCH" xyz.lib

(ya da mheyman'ın cygwin veya msys'de lehine karar verdiyse)

Sonuç buna benzer olabilir:

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"

İlk yönergeye dikkat edin: "_MSC_VER = NNNN". Gözlemimde, NNNN her zaman nesne dosyasını oluşturmak için kullanılan derleyici sürümüyle eşleşir. Benim durumumda, xyz.lib MSVC 2015 update 3 ile oluşturuldu, C ++ derleyici sürümü 19.00.24215, bu yüzden / FAILIFMISMATCH: nesne dosyasında "_ MSC_VER = 1900" koydu.

Visual Studio sürümü ve Microsoft C / C ++ Derleyici sürümü arasında bir ayrıntı eşlemesi bulunabilir. burada.


0
2017-09-05 08:23





Dili belirtmediniz, ancak C # 'de işletim sistemi ve .NET sürümünü (çalışma zamanında kodunuzda) bilmek için cevap:

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

Yönetilen C ++ / CLI'de bir eşdeğer olurdu

Bu size derleyici ya da IDEama size .NET çalışma zamanlarının vericisini söyleyecektir. İşletim sistemi sürümünü bilmeniz gerekebilir veya olmayabilir.

-Jesse


-2
2018-06-25 20:40



Bu, sorulan soruyla uzaktan bile ilgili değildir. Soruda herhangi bir dil bulunmadığı halde (hangisi doğruysa, soruya verilen), statik kütüphanelerden bahseder. Statik kütüphaneler yerel kodu gösterir. Soru aslında, hangi çalışma zamanı sürümünün ikili kodda derlendiğini soruyor. İşletim sistemi sürümü burada ilgi çekici değil. - IInspectable