Existe uma maneira de determinar qual versão do Visual Studio foi usado para compilar uma biblioteca estática?

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

Pergunta

Eu tenho uma coleção de bibliotecas estáticos (.lib) arquivos um dos quais pode ter sido construído com uma versão diferente do Visual Studio. Isso está causando a geração de código de um projeto que as ligações contra todos eles para falhar. Existe alguma maneira para determinar qual versão do Visual Studio foi usado para compilar uma biblioteca estática?

Foi útil?

Solução

Para bibliotecas de libertação, é improvável que você poderia determinar a versão.

Para bibliotecas de depuração, você pode usar dumpbin :

dumpbin /rawdata:1 library.lib

O manifesto do assembly deve ser no início do despejo e conterá a versão do CRT a biblioteca exige juntamente com o caminho completo para o compilador usado para construir a biblioteca.

Para executáveis ??e DLLs pode receber a versão vinculador usando dumpbin; é em "valores de cabeçalho opcional"

dumpbin /headers program.exe

Talvez alguém sabe de uma maneira de obter a versão para bibliotecas de libertação; Estou certamente interessado também se eles são.

Outras dicas

Eu tenho algo sempre utilizado como (em uma janela cygwin):

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

O compilador coloca o caminho do compilador na biblioteca em compilações de depuração e localização compilador padrão do Visual Studio está em um caminho que inclui o texto 'Visual Studio'.

Assim, como James McNellis' resposta, isso também funciona somente para compilações de depuração e é ainda mais restrita aos compilações que realmente usa um compilador que fica em um diretório com 'Visual Studio # ' no caminho .

Eu encontrei este método anos atrás por um pouco de acaso e ele ainda tem que falhar.

Isto tem a vantagem de que é fácil de lembrar se você estiver familiarizado com as ferramentas de linha de comando Unix.

Se você tiver arquivos do .PDB correspondente, então você pode ver a versão do compilador de lá com uma ferramenta como Pdb Inspector .

Ou abra o PDB em um visualizador hexadecimal e procure a string "Microsoft (R) Otimizando Compiler". A versão será em quatro valores hexadecimais de 2 bytes pouco antes que cordas, como neste exemplo:

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

A versão é, portanto, HEX 13 00, 00 00, 6E 5D, 00 00, ou 19.0.23918.0.

Se a biblioteca estática foi escrito em C ++, e foi construído com MSVC 2010 ou versão mais recente, uma directiva FAILIFMISMATCH pode ter sido colocada pelo compilador para os arquivos objeto.

Eu não posso encontrado o documento oficial da Microsoft sobre a directiva FAILIFMISMATCH, mas parece ser usado por vinculador para detectar incompatibilidades entre as versões da biblioteca padrão C ++.

Você pode usar o seguinte comando para imprimir essas directivas a partir de uma biblioteca estática:

find "FAILIFMISMATCH" xyz.lib

(ou use o caminho que mheyman mencionou se você favorecem em cygwin ou msys)

O resultado pode ser semelhante a este:

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"

Observe a primeira directiva: "_MSC_VER = NNNN". Na minha observação, o nnnn é sempre corresponder à versão do compilador usado para criar o arquivo objeto. No meu caso, o xyz.lib era criar com MSVC 2015 atualização 3, o C ++ versão do compilador é 19.00.24215, por isso colocar / FAILIFMISMATCH: "_ MSC_VER = 1900" no arquivo objeto

.

Um mapeamento detalhe entre a versão Visual Studio e versão Microsoft C / C ++ Compiler pode ser encontrada at aqui .

Você não especificar o idioma, mas em C # a resposta para saber o sistema operacional e versão .NET (em seu código em tempo de execução) é:

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

Não seria um equivalente em C ++ gerenciado / CLI

Isso não vai dizer-lhe o verison do compilador ou do IDE , mas irá dizer-lhe o verison dos tempos de execução .NET. Você pode ou não pode precisar de saber a versão OS.

-Jesse

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top