Статические библиотеки отладочных символов - PullRequest
62 голосов
/ 28 сентября 2011

В VS2010 есть опция для генерации отладочной информации для exes / dll под linker , но нет такой опции под библиотекарем для библиотек. Встроена ли отладочная информация в статическую библиотеку?

В свойствах C / C ++ есть опция для Имя файла базы данных программы для libs, exes и dll. По умолчанию он входит в мой промежуточный каталог и называется именем проекта для libs, но с именем vc $ (PlatformToolsetVersion) .pdb для exes / dll. Что такое pdb из этого параметра и чем он отличается от pdb в параметре компоновщика?

Если я поставляю библиотеку с библиотеками и заголовками, как я могу предоставить отладочные символы пользователю моей библиотеки?

Ответы [ 5 ]

51 голосов
/ 28 сентября 2011

Если вы используете /ZI или /Zi (C/C++ -> General -> Debug Information Format), то создается vc$(PlatformToolsetVersion).pdb, который содержит отладочную информацию для всех файлов .obj создано. Если вы поочередно используете /Z7, отладочная информация будет встроена в файл .obj, а затем встроена в .lib. Это, вероятно, самый простой способ распространения отладочной информации для статической библиотеки .

Однако я бы не советовал распространять статическую библиотеку, поскольку она обычно привязана к конкретной версии компилятора.

34 голосов
/ 11 сентября 2015

Расширение на предыдущие ответы, для тех, кто нуждается в полном практическом руководстве (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. Проект приложения: Свяжите свой исполняемый файл со статической библиотекой и новым файлом PDB :

    • Опять же, перейдите к свойствам проекта, но на этот раз для вашего проекта приложения
    • Снова отредактируйте Debug Information свойство по мере необходимости.
    • Редактировать Configuration Properties -> Linker -> General -> Additional Library Directories, добавив свой собственный каталог "libs" или любой другой каталог, в котором вы планируете хранить / копировать файлы YourLib.lib и YourLib.pdb.
    • Редактировать Configuration Properties -> Linker -> Input -> Additional Dependencies, добавив YourLib.lib (без пути впереди)
    • Теперь скопируйте и YourLib.lib и YourLib.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» применим и к проекту приложения.
17 голосов
/ 24 февраля 2014

Я заметил, что в VS2013 можно задать имя файла базы данных программы на вкладке Выходные файлы C / C ++.Изменение значения по умолчанию на что-то вроде $ (OutDir) $ (TargetName) .pdb решает проблему

5 голосов
/ 28 сентября 2011

Статические библиотеки встроены в программы, которые их используют.

Если программа, использующая их, использует символы отладки, код скомпилированной библиотеки в этой программе также будет иметь символы.

PDBинформация из википедии:

Когда символы отладки внедряются в сам двоичный файл, файл может значительно увеличиться (иногда на несколько мегабайт).Чтобы избежать этого дополнительного размера, современные компиляторы и ранние системы отладки мэйнфреймов выводят символическую информацию в отдельный файл;для компиляторов Microsoft этот файл называется файлом PDB.

1 голос
/ 25 июня 2015

Странное поведение в VS2012. Сборка с нуля (или с параметром / A в nmake) даст файл .pdb. Теперь удалите .lib и .pdb и перезапустите nmake (без / A, конечно, чтобы запустить только ссылку), и файл .pdb не будет выведен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...