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