Nice programing

정적 라이브러리 디버그 기호

nicepro 2020. 11. 24. 19:53
반응형

정적 라이브러리 디버그 기호


VS2010에는 링커 아래에 exes / dll에 대한 디버그 정보를 생성하는 옵션이 있지만 librarian 에는 이러한 옵션이 없습니다 . 디버그 정보가 정적 라이브러리에 포함되어 있습니까?

libs, exes 및 dll에 대한 프로그램 데이터베이스 파일 이름에 대한 C / C ++ 속성에 옵션이 있습니다 . 기본적으로 내 중간 디렉터리로 이동하여 libs의 프로젝트 이름이 지정되지만 exes / dll의 경우 vc $ (PlatformToolsetVersion) .pdb이름이 지정 됩니다. 이 옵션의 pdb는 무엇이며 링커 옵션의 pdb와 어떻게 다릅니 까?

라이브러리에 라이브러리와 헤더를 제공하는 경우 라이브러리 사용자에게 디버그 기호를 어떻게 제공합니까?


당신이 사용하는 경우 /ZI또는 /Zi( C/C++-> General-> Debug Information Format), 다음이 vc$(PlatformToolsetVersion).pdb의 모든 디버그 정보를 포함하는 생성됩니다 .obj생성 된 파일을. 또는을 사용 /Z7하는 경우 디버그 정보가 .obj파일에 포함 된 다음 .lib. 이것은 아마도 정적 라이브러리에 대한 디버그 정보를 배포하는 가장 쉬운 방법 일 것입니다 .

그러나 정적 라이브러리를 배포하는 것은 일반적으로 특정 버전의 컴파일러에 연결되어 있기 때문에 권장하지 않습니다.


전체 방법이 필요한 사람들을 위해 이전 답변을 확장합니다 (VS 2013).

이것은 VS2013 문제에 관한 위의 의견을 다루어야합니다.

방법 1 : 프로그램 데이터베이스 (.pdb) 방식 (/ Zi 또는 / ZI)

  1. 정적 라이브러리 프로젝트 : 정적 라이브러리 와 동일한 이름으로 pdb를 생성합니다.

    • 메뉴 Solution Explorer에서 엽니 다 View.
    • 정적 lib 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 Properties
    • 편집 Configuration Properties-> C/C++-> General-> Debug Information/Zi/ZI
      • /ZI디버깅 중에 "편집 및 계속"편집 허용합니다.
    • 편집 Configuration Properties-> C/C++-> Output Files-> Program Database File Name$(OutDir)$(TargetName).pdb
    • 이제 컴파일하고 YourLib.lib 및 YourLib.pdb가 어디에 있는지 확인하십시오.
  2. 응용 프로그램 프로젝트 : 실행 파일을 정적 lib 및 새 PDB 파일과 연결합니다 .

    • 다시 프로젝트 속성으로 이동하지만 이번에는 애플리케이션 프로젝트에 대해
    • 다시, Debug Information필요에 따라 속성을 편집 합니다.
    • 편집 Configuration Properties-> Linker-> General-> Additional Library Directories, 자신의 "libs"디렉토리를 추가하거나 YourLib.lib 및 YourLib.pdb 파일을 유지 / 복사하려는 디렉토리를 추가하십시오.
    • 편집 Configuration Properties-> Linker-> Input-> Additional Dependencies, 추가 YourLib.lib(앞에 경로 없음)
    • 이제 YourLib.libYourLib.pdb 를 위에서 지정한 디렉토리에 복사하십시오 .

방법 2 : 포함 된 기호 (.pdb 없음) 방식 (/ Z7)

  1. 정적 라이브러리 프로젝트 : 디버그 기호가 포함 된 정적 라이브러리 생성

    • 방법 1에서와 같이 프로젝트 속성으로 이동합니다.
    • 방법 1에서와 같이, 당신을 수정 Debug Information, 하지만이 시간에/Z7
    • 방법 1에서와 같이 YourLib.lib가 생성되는 위치를 컴파일하고 기록하십시오.
  2. 애플리케이션 프로젝트 : 실행 파일을 정적 라이브러리와 연결

    • 방법 1에서와 같이 프로젝트 속성으로 이동합니다.
    • 방법 1에서 Debug Information와 같이 필요에 따라 속성을 수정합니다.
    • 방법 1에서와 같이 편집 Additional Library Directories
    • 방법 1에서와 같이 편집 Additional Dependencies
    • 이제 YourLib.lib를 다음에 지정된 디렉토리에 복사하십시오. Additional Library Directories

토론:

  • Z7의 장점? 더 간단하고 "단일 파일"방식입니다. 모든 디버그 정보는 lib 파일에 있습니다.
  • Z7의 단점? 디스크상의 파일 크기, 링크 시간, "최소 재 구축"(/ Gm) 기능과 호환 되지 않음 , "편집 및 계속"을 허용 하지 않음 , 이전 형식 (예 : 이전 패러다임)
  • Debug Information애플리케이션 프로젝트에 대한 설정을 지정하지 않는 이유는 무엇 입니까? 이 게시물은 정적 lib 코드에서 디버그 작업을 수행하는 방법에 관한 것입니다. 동일한 "방법 1 대 방법 2"선택이 응용 프로그램 프로젝트에도 적용됩니다.

VS2013에서는 C / C ++ 출력 파일 탭에서 프로그램 데이터베이스 파일 이름을 설정할 수 있습니다. 기본값에서 $ (OutDir) $ (TargetName) .pdb 와 같은 것으로 변경 하면 문제가 해결됩니다.


정적 라이브러리는이를 사용하는 프로그램에 구현됩니다.

이를 사용하는 프로그램이 디버그 기호를 사용하는 경우 해당 프로그램의 컴파일 된 라이브러리 코드에도 기호가 있습니다.

wikipedia의 PDB 정보 :

디버그 기호가 바이너리 자체에 포함되면 파일이 상당히 커질 수 있습니다 (때로는 몇 메가 바이트까지). 이러한 추가 크기를 피하기 위해 최신 컴파일러와 초기 메인 프레임 디버깅 시스템은 기호 정보를 별도의 파일로 출력합니다. Microsoft 컴파일러의 경우이 파일을 PDB 파일이라고합니다.


VS2012의 이상한 행동. 처음부터 빌드 (또는 nmake의 / A 옵션 사용)하면 .pdb 파일이 생성됩니다. 이제 .lib 및 .pdb를 삭제하고 nmake를 다시 실행하면 (물론 링크 만 실행하려면 / A없이) .pdb 파일이 출력되지 않습니다.

참고 URL : https://stackoverflow.com/questions/7575298/static-library-debug-symbols

반응형