2009-09-11 17 views
20

Mam zbiór bibliotek statycznych (.lib), z których jeden mógł zostać zbudowany przy użyciu innej wersji programu Visual Studio. Powoduje to niepowodzenie generowania kodu projektu, który łączy wszystkie z nich. Czy istnieje sposób ustalenia, która wersja programu Visual Studio została użyta do kompilacji biblioteki statycznej?Czy istnieje sposób określenia, która wersja programu Visual Studio została użyta do kompilacji biblioteki statycznej?

+3

Lepiej zadać sobie pytanie, która wersja kompilatora. Możliwe jest kompilowanie statycznych bibliotek C++ bez użycia Visual Studio. – JaredPar

+0

Wystarczająco fair. W moim przypadku wszystkie są skompilowane z * pewną * wersją Visual Studio. Istnieje jednak bardziej ogólne pytanie. –

Odpowiedz

20

W przypadku bibliotek wersji jest mało prawdopodobne, aby można było ustalić wersję.

Dla bibliotek debugowania, można użyć dumpbin:

dumpbin /rawdata:1 library.lib 

Manifest montaż powinien być na początku wysypisko i będzie zawierać wersję CRT biblioteka wymaga wraz z pełną ścieżkę do kompilatora użyte do zbudowania biblioteki.

W przypadku plików wykonywalnych i bibliotek DLL można uzyskać wersję łącznika za pomocą dumpbina; to pod „opcjonalne wartości nagłówka”

dumpbin /headers program.exe 

Może ktoś zna sposób, aby uzyskać wersji dla bibliotek uwalnianiu; Z pewnością też jestem zainteresowany.

+0

Czy możesz udostępnić niektóre informacje na temat tego, gdzie można znaleźć to narzędzie lub jeśli nie jest ono domyślnie dostępne z instalacją programu Visual Studio, a następnie skąd możemy je pobrać? –

+0

Czy podejście 'dumpbin/headers program.exe' nie działa również z plikami binarnymi wydań? Wypróbowałem to i zadziałało. – stackoverflowwww

5

Zawsze stosować coś takiego (w cygwin oknie):

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

Kompilator przykleja ścieżkę do kompilatora w bibliotece debugowania buduje i domyślny kompilator lokalizacja Visual Studio jest pod ścieżką w tym tekst "Visual Studio".

Tak, jak James McNellis' odpowiedź, to też działa tylko do debugowania buduje i jest dodatkowo ograniczone do buduje że faktycznie korzysta z kompilatora, który znajduje się w katalogu z «Visual Studio #» w ścieżce.

Znalazłem tę metodę wiele lat temu przez odrobinę szczęścia i jeszcze się nie udało.

Ma to tę zaletę, że łatwo je zapamiętać, jeśli znasz narzędzia wiersza poleceń systemu Unix.

-2

Nie określić język, ale w C# odpowiedzią na znajomości systemu operacyjnego i wersji .NET (w kodzie w czasie wykonywania) wynosi:

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

Nie byłoby odpowiednikiem w Managed C++/CLI

To nie powie Verison z kompilatora lub w IDE, ale powiem wam Verison z czasy pracy .NET. Możesz lub nie musisz znać wersji systemu operacyjnego.

-Jesse

+0

Nie jest to nawet związane z pytaniem. Chociaż nie ma języka określonego w pytaniu (co jest poprawne, biorąc pod uwagę pytanie), mówi o bibliotekach statycznych. Biblioteki statyczne implikują natywny kod. Zasadniczo chodzi o pytanie, która wersja środowiska uruchomieniowego jest wkompilowana w kod binarny. Wersja systemu operacyjnego nie jest tutaj interesująca. – IInspectable

3

Jeśli masz odpowiednie pliki .pdb następnie można zobaczyć wersję kompilatora stamtąd za pomocą narzędzia podobnego Pdb Inspector.

Lub otwórz PDB w przeglądarce hex i wyszukaj ciąg "Microsoft (R) Optimizing Compiler".Wersja będzie w czterech wartościach 2-bajtowy sześciokątnych tuż przed tym ciągiem, jak w poniższym przykładzie:

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

wersja jest więc HEX 13 00, 00 00, 6E 5D, 00 00, lub 19.0.23918.0.

0

Jeśli biblioteka statyczna została napisana w C++ i została zbudowana za pomocą MSVC 2010 lub nowszej wersji, dyrektywa FAILIFMISMATCH mogła zostać umieszczona przez kompilator w plikach obiektowych.

Nie mogę znaleźć oficjalnego dokumentu firmy Microsoft na temat dyrektywy FAILIFMISMATCH, ale wydaje się, że jest używany przez linker do wykrywania niezgodności między wersjami standardowej biblioteki C++.

można użyć następującego polecenia, aby wydrukować te wskazówki od statycznej biblioteki:

find "FAILIFMISMATCH" xyz.lib 

(lub użyć sposobu, mheyman wspomniał jeśli sprzyjają w Cygwin lub Msys)

Wynik może być podobny do tego:

[email protected] /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" 

Uwaga pierwsza dyrektywa: "_MSC_VER = NNNN". W mojej obserwacji NNNN jest zawsze zgodny z wersją kompilatora używaną do utworzenia pliku obiektu. W moim przypadku plik xyz.lib został utworzony z aktualizacją 3 MSVC 2015, jego wersja kompilatora C++ to 19.00.24215, więc umieszcza/FAILIFMISMATCH: "_ MSC_VER = 1900" w pliku obiektowym.

Mapowanie szczegółów między wersją programu Visual Studio a wersją kompilatora Microsoft C/C++ można znaleźć pod adresem at here.

Powiązane problemy