정적 라이브러리를 컴파일하는 데 사용 된 Visual Studio 버전을 결정하는 방법이 있습니까?

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

문제

정적 라이브러리 (.lib) 파일 모음이 있습니다. 그 중 하나는 다른 버전의 Visual Studio로 제작되었을 수 있습니다. 이로 인해 모든 프로젝트가 실패하게되는 프로젝트의 코드 생성이 발생합니다. 정적 라이브러리를 컴파일하는 데 사용 된 Visual Studio 버전을 결정할 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

릴리스 라이브러리의 경우 버전을 결정할 수는 없습니다.

디버그 라이브러리의 경우 사용할 수 있습니다 덤프 빈:

dumpbin /rawdata:1 library.lib

어셈블리 매니페스트는 덤프의 시작 부분에 있어야하며 라이브러리가 필요한 CRT 버전과 라이브러리를 빌드하는 데 사용되는 컴파일러의 전체 경로와 함께 제공됩니다.

실행 파일 및 DLL의 경우 덤프 빈을 사용하여 링커 버전을 얻을 수 있습니다. "옵션 헤더 값"아래에 있습니다.

dumpbin /headers program.exe

어쩌면 다른 사람이 릴리스 라이브러리 버전을 얻는 방법을 알고있을 것입니다. 나도 그들이 그렇다면 확실히 관심이 있습니다.

다른 팁

나는 항상 (Cygwin 창에서)와 같은 것을 사용했습니다.

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

컴파일러는 디버그 빌드시 라이브러리의 컴파일러 경로를 고수하고 Visual Studio의 컴파일러 기본 위치는 'Visual Studio'텍스트가 포함 된 경로 아래에 있습니다.

따라서 James McNellis의 답변과 마찬가지로 이것은 디버그 빌드에만 적용되며 'Visual Studio가있는 디렉토리에있는 컴파일러를 실제로 사용하는 빌드로 더 제한됩니다. #'길에서.

나는 몇 년 전이 방법을 약간의 세렌디피티를 통해 발견했지만 아직 실패하지 않았습니다.

UNIX 명령 줄 도구에 익숙하다면 기억하기 쉬운 이점이 있습니다.

해당 .pdb 파일이있는 경우 다음과 같은 도구로 컴파일러 버전을 볼 수 있습니다. PDB 검사관.

또는 HEX 뷰어에서 PDB를 열고 문자열 "Microsoft (R) 최적화 컴파일러"를 검색하십시오. 버전은이 예제에서와 같이 해당 문자열 직전에 4 개의 2 바이트 육각 값으로 표시됩니다.

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

따라서 버전은 16 진 13 00, 00 00, 6E 5D, 00 00 또는 19.0.23918.0입니다.

정적 라이브러리가 C ++로 작성되어 MSVC 2010 또는 최신 버전으로 구축 된 경우, 객체 파일에 컴파일러에 의해 FailifMistath 지시를 적용했을 수 있습니다.

Microsoft에서 Failifmismatch Directive에 대한 공식 문서를 찾을 수는 없지만 C ++ 표준 라이브러리 버전 간의 비 호환성을 감지하는 데 링커가 사용하는 것 같습니다.

다음 명령을 사용하여 정적 라이브러리에서 해당 지시문을 인쇄 할 수 있습니다.

find "FAILIFMISMATCH" xyz.lib

(또는 Cygwin 또는 MSYS에서 선호하는 경우 Mheyman이 언급 한 방식을 사용하십시오)

결과는 이것과 유사 할 수 있습니다.

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"

첫 번째 지시문 : "_msc_ver = nnnn". 내 관찰에서 NNNN은 항상 객체 파일을 작성하는 데 사용되는 컴파일러 버전과 일치합니다. 필자의 경우 xyz.lib는 MSVC 2015 업데이트 3으로 작성되었으며 C ++ 컴파일러 버전은 19.00.24215이므로 객체 파일에 "_ MSC_VER = 1900"을 넣습니다.

Visual Studio 버전과 Microsoft C/C ++ 컴파일러 버전 간의 세부 사항 매핑을 찾을 수 있습니다. 여기에.

언어를 지정하지는 않았지만 C#에서 OS 및 .NET 버전을 아는 대답 (런타임시 코드에서)은 다음과 같습니다.

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

관리되는 C ++/CLI에는 동등한 점이있을 것입니다.

그것은 당신에게 당신에게의 동결을 말하지 않을 것입니다 컴파일러 또는 IDE, 그러나 .net runtimes의 동결을 알려줄 것입니다. OS 버전을 알거나 필요하지 않을 수도 있습니다.

-제시

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top