Символы отладки статической библиотеки
В VS2010 есть опция генерировать информацию об отладке для exes/dll в компоновщике, но нет такой опции в библиотеке для libs. Является ли информация об отладке встроенной в статическую библиотеку?
В свойствах C/С++ для имени файла базы данных программы есть опция для библиотек, exes и dll. По умолчанию он входит в мой промежуточный каталог и называется именем проекта для libs, но называется vc $(PlatformToolsetVersion).pdb для exes/dlls. Что такое pdb из этой опции и как она отличается от pdb в опции компоновщика?
Если я поставляю библиотеку с библиотеками и заголовками, как я могу предоставить символы отладки для пользователя моей библиотеки?
Ответы
Ответ 1
Если вы используете /ZI
или /ZI
(C/C++
→ General
→ Debug 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 Properties
→ C/C++
→ General
→ Debug Information
на /Zi
или /Zi
- Обратите внимание, что
/Zi
разрешает редактирование и редактирование во время отладки
- Изменить
Configuration Properties
→ C/C++
→ Output Files
→ Program Database File Name
на $(OutDir)$(TargetName).pdb
- Теперь скомпилируйте его и обратите внимание, где находятся вашиLib.lib и YourLib.pdb.
-
Application Project: связать свой исполняемый файл со статическим 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.lib, так и YourLib.pdb в каталог, указанный выше.
Метод 2: Встроенные символы (нет .pdb) Способ (/Z7)
Обсуждение:
- Преимущества 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 выводится.