Czy istnieje sposób na określenie, która wersja Visual Studio została użyta do skompilowania statycznej biblioteki?

Mam zbiór bibliotek statycznych (.lib) pliki, z których jeden mógł być zbudowany z innej wersji Visual Studio. Powoduje to, że generowanie kodu projektu, który łączy się z nimi wszystkimi, kończy się niepowodzeniem. Czy jest jakiś sposób, aby określić, która wersja Visual Studio została użyta do skompilowania statycznej biblioteki?

Author: Bill Carey, 2009-09-11

5 answers

W przypadku bibliotek release jest mało prawdopodobne, aby można było określić wersję.

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

dumpbin /rawdata:1 library.lib

Manifest assembly powinien znajdować się na początku zrzutu i zawierać wersję CRT wymaganą przez Bibliotekę wraz z pełną ścieżką do kompilatora używanego do budowania biblioteki.

Dla plików wykonywalnych i bibliotek DLL można uzyskać wersję linkera za pomocą dumpbin; jest to pod "opcjonalne wartości nagłówka"

dumpbin /headers program.exe

Maybe ktoś jeszcze zna sposób na uzyskanie wersji dla bibliotek release ' owych; mnie też na pewno interesuje, czy są.

 22
Author: James McNellis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-09 01:46:42

Zawsze używałem czegoś takiego (w oknie Cygwina):

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

Kompilator przykleja ścieżkę kompilatora do biblioteki podczas kompilacji debugowania, a domyślna lokalizacja kompilatora Visual Studio znajduje się pod ścieżką zawierającą tekst 'Visual Studio'.

Tak jak odpowiedź Jamesa Mcnellisa, działa to również tylko dla kompilacji debugujących i jest dodatkowo ograniczone do kompilacji, które faktycznie używają kompilatora, który znajduje się w katalogu z 'Visual Studio #' na ścieżce.

Znalazłem ta metoda lata temu przez trochę serendipity i jeszcze nie zawiodła.

Ma to tę zaletę, że jest łatwe do zapamiętania, jeśli znasz narzędzia wiersza poleceń Uniksa.

 7
Author: mheyman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-06 19:10:45

Jeśli masz odpowiedni .Pliki PDB następnie możesz zobaczyć wersję kompilatora stamtąd za pomocą narzędzia takiego jak Pdb Inspector .

Lub otwórz PDB w przeglądarce szesnastkowej i wyszukaj ciąg "Microsoft (R) Optimizing Compiler". Wersja będzie miała cztery 2-bajtowe wartości szesnastkowe tuż przed tym łańcuchem, jak w tym 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.

 5
Author: rustyx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-19 08:45:36

Jeśli biblioteka statyczna została napisana w C++ i została zbudowana z MSVC 2010 lub nowszej wersji, kompilator mógł umieścić dyrektywę FAILIFMISMATCH w plikach obiektowych.

Nie mogę znaleźć oficjalnego dokumentu Microsoftu o dyrektywie FAILIFMISMATCH, ale wydaje się, że jest on używany przez linker do wykrywania niezgodności między wersjami biblioteki standardowej C++.

Możesz użyć następującego polecenia, aby wydrukować te dyrektywy ze statycznej biblioteki:

find "FAILIFMISMATCH" xyz.lib

(lub użyj sposobu, o którym wspomniał mheyman, jeśli wolisz w cygwinie lub msys)

Wynik może być podobny do tego:

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"

Zwróć uwagę na pierwszą dyrektywę: "_MSC_VER=NNNN". Z moich obserwacji wynika, że NNNN zawsze odpowiada wersji kompilatora użytej do wytworzenia pliku obiektowego. W moim przypadku xyz.lib został stworzony z MSVC 2015 update 3, jego wersja kompilatora C++ jest 19.00.24215, więc umieścić /FAILIFMISMATCH: "_MSC_VER=1900" w pliku obiektowym.

Odwzorowanie szczegółów pomiędzy wersją Visual Studio a Wersja kompilatora Microsoft C/C++ znajduje się tutaj .

 0
Author: zevoid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-05 08:23:03

Nie podałeś języka, ale w C# odpowiedź na poznanie wersji systemu operacyjnego i. Net (w kodzie podczas pracy) brzmi:

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

W Managed C++/CLI będzie odpowiednik

To nie powie Ci wersji kompilatora lubIDE , ale powie Ci wersji środowisk uruchomieniowych.NET. Możesz lub nie musisz znać wersji systemu operacyjnego.

-Jesse

 -3
Author: Jesse Chisholm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-25 22:25:18