Nice programing

.lib 파일 검사 도구?

nicepro 2020. 11. 1. 18:41
반응형

.lib 파일 검사 도구?


문서화되지 않은 일부 소프트웨어를 평가하고 있습니다. 샘플 프로젝트를 빌드 할 때 다음과 같은 링커 오류가 발생합니다.

오류 LNK2019 : 해결되지 않은 외부 기호

이 앱에는 lib 파일이 많지 않으므로 시행 착오를 통해이 문제를 해결할 수 있지만 이 문제를 해결 하는 더 우아한 방법이 있음을 알고 있습니다.

자바 세계에서 나는 항아리를 찾기 위해 FOO * .jargrep 하고 C ++ 아날로그를 찾고 있습니다. Visual Studio 2005에서 C ++ 코드로 작업하고 있습니다.

/ LIST 옵션이있는 lib.exe 유틸리티가 정보를 얻을 수 있다고 생각하지만 지금까지 성공하지 못했습니다. 다음과 같이 인쇄됩니다.

Microsoft (R) Library Manager 버전 8.00.50727.762
저작권 (C) Microsoft Corporation. 판권 소유.

granite50.dll
granite50.dll
granite50.dll
granite50.dll
...

어떤 제안?


우선 어떤 유형의 라이브러리를보고 있는지 알아야합니다. 일부 라이브러리는 단순히 DLL (즉, 가져 오기 라이브러리)에 대한 링크를 포함하고 다른 라이브러리는 실행 가능 이미지의 일부가되는 코드 객체 (예 : 정적 라이브러리)입니다. 해당 출력의 모양에서 DLL 가져 오기 라이브러리를보고있었습니다.

다음으로 올바른 도구를 사용하려고합니다. Lib.exe는 라이브러리에서 개체 파일을 추출하는 데 사용됩니다. 이것은 Java 용 jar 유틸리티와 거의 동일합니다. Microsoft는 라이브러리에서 정보를 덤프하는 dumpbin.exe를 제공합니다. LarryF가 이미 이것을 언급 한 것을 봅니다 .

가져 오기 라이브러리의 경우 실행 dumpbin.exe -headers foo.lib하고 출력 파일로 리디렉션합니다. 출력에는 관련 DLL이 내보내는 각 기호에 대한 스 니펫이 포함됩니다. 로 시작하는 줄을 검색합니다 " Symbol name :". 정확히 일치하려면 "기호 이름"앞뒤에 두 개의 공백이 있습니다. 출력을 실행하여 findstr심볼 목록을 생성하고 좀 더보기 좋은 것을 원한다면 텍스트 파일로 리디렉션 할 수도 있습니다 .

dumpbin.exe -headers foo.lib | findstr /c:"  Symbol name  :" > foo-exports.txt

다른 옵션은 관련 DLL을 depends.exe.


여기에서 한 가지 이상이 문제가 될 수 있습니다. lib 파일을 찾는 것이이 문제를 해결하는 가장 좋은 방법이 될지 모르겠습니다. IMHO ... 그러나 DUMPBIN.exe는 아마도 당신이 찾고있는 도구 일 것입니다. 명령 줄에서 사용하되 경로가 설정되어 있는지 확인하거나 VS 시작 메뉴에서 VS가 설치하는 "Visual Studio 명령 프롬프트"를 사용합니다.


DLL이 있고 코드에서 사용하려는 __declspec(dllimport)경우 DLL 용 DEF 파일이 있으면 필요한 LIB 파일을 쉽게 만들 수 있습니다.

lib /def:mydll.def /nologo /machine:x86  

mydll.lib 를 생성 합니다.

이 명령은 Visual Studio SDK 명령 프롬프트에서 실행해야합니다.

DEF 파일이없는 경우 수동으로 매우 쉽게 작성할 수 있습니다. DependencyWalker ( http://www.dependencywalker.com ) 에서 DLL을 열고 "다른 이름으로 저장"-> "가져 오기 / 내보내기 목록이있는 텍스트"를 선택합니다. 다음과 같이 txt 파일에 내 보낸 모든 함수 이름서수 를 포함합니다.

Export  Ordinal      Hint         Function                          Entry Point
------  -----------  -----------  --------------------------------  -----------
[C  ]    2 (0x0002)   1 (0x0001)  gsasl_base64_from                 0x000024F0
[C  ]    3 (0x0003)   2 (0x0002)  gsasl_base64_to                   0x000024A0
[C  ]    4 (0x0004)   3 (0x0003)  gsasl_callback                    0x000018B0
[C  ]    5 (0x0005)   4 (0x0004)  gsasl_callback_hook_get           0x00001900
[C  ]    6 (0x0006)   5 (0x0005)  gsasl_callback_hook_set           0x000018F0
[C  ]    7 (0x0007)   6 (0x0006)  gsasl_callback_set                0x000018A0
[C  ]    8 (0x0008)   7 (0x0007)  gsasl_check_version               0x00001870
[C  ]    9 (0x0009)   8 (0x0008)  gsasl_client_mechlist             0x00001E20
[C  ]   10 (0x000A)   9 (0x0009)  gsasl_client_start                0x00001F40

나머지는 빠르게 완료됩니다. 다음 형식 DEF 파일만듭니다 .

EXPORTS
gsasl_base64_from @2
gsasl_base64_to @3
gsasl_callback @4
gsasl_callback_hook_get @5
gsasl_callback_hook_set @6
gsasl_callback_set @7
gsasl_check_version @8
gsasl_client_mechlist @9
gsasl_client_start @10
gsasl_client_suggest_mechanism @11

@ 뒤에있는 숫자는 서수입니다.


PD : DependencyWalker는 C ++ 내보내기의 숨겨진 이름을 다음과 같이 꾸밀 수도 있습니다.

Foo@@YGHHH@Z   -->   int Foo(int, int). 

이것은 Visual C ++ express 9 .lib로 작동했습니다.

dumpbin.exe -headers clangParse.lib | findstr / c : "COMDAT"> clangParse-exports.txt

or dumpbin.exe -headers clangParse.lib | findstr /c:"sym=" > clangParse-exports.txt

thank you d.shawley


open Visual Studio Command Prompt

dumpbin /all Effects11.lib > D:\1.txt

참고URL : https://stackoverflow.com/questions/488809/tools-for-inspecting-lib-files

반응형