Символы отладки статической библиотеки

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

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

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

Ответ 1

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

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

Ответ 2

Расширение предыдущих ответов для тех, кому необходимо полное руководство (VS 2013).

Обратите внимание, что это должно касаться комментариев ^^ выше, касающихся проблем VS2013.

Метод 1: База данных программы (.pdb) Способ (/Zi или /ZI )

  • Static Lib Project: сгенерируйте pdb с тем же именем, что и ваш статический lib:

    • Откройте Solution Explorer в меню View.
    • Щелкните правой кнопкой мыши ваш статический проект lib, выберите Properties
    • Изменить Configuration PropertiesC/C++GeneralDebug Information на /Zi или /Zi
      • Обратите внимание, что /Zi разрешает редактирование и редактирование во время отладки
    • Изменить Configuration PropertiesC/C++Output FilesProgram Database File Name на $(OutDir)$(TargetName).pdb
    • Теперь скомпилируйте его и обратите внимание, где находятся вашиLib.lib и YourLib.pdb.
  • Application Project: связать свой исполняемый файл со статическим lib и новым файлом PDB:

    • Опять же, перейдите к свойствам проекта, но на этот раз для вашего проекта приложения
    • Снова отредактируйте свойство Debug Information по мере необходимости.
    • Изменить Configuration PropertiesLinkerGeneralAdditional Library Directories, добавив свой собственный каталог "libs" или любой другой каталог, который вы планируете хранить/копировать ваши файлы YourLib.lib и YourLib.pdb.
    • Изменить Configuration PropertiesLinkerInputAdditional Dependencies, добавив YourLib.lib (нет пути впереди)
    • Теперь скопируйте как YourLib.lib, так и YourLib.pdb в каталог, указанный выше.

Метод 2: Встроенные символы (нет .pdb) Способ (/Z7)

  • Static Lib Project: создайте статический lib со встроенными символами отладки

    • Как и в методе 1, перейдите к свойствам проекта
    • Как и в методе 1, измените Debug Information, , но на этот раз /Z7
    • Как и в методе 1, скомпилируйте и обратите внимание, где генерируется YourLib.lib.
  • Проект приложения: свяжите исполняемый файл со статическим lib

    • Как и в методе 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" применяется также для проекта приложения.

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 5

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