静态库调试符号

在 VS2010中,在 连接器下有一个为 ex/dlls 生成调试信息的选项,但是在 图书管理员下没有为 libs 生成调试信息的选项。调试信息是否嵌入到静态库中?

对于 libs、 exx 和 dls,程序数据库文件名C/C + + 属性中有一个选项。默认情况下,它会进入我的中间目录,为 libs 命名为项目名,但为 ex/dlls 命名为 Vc $(PlatformToolsetVersion) . pdb。这个选项中的 pdb 是什么? 它与链接器选项中的 pdb 有什么不同?

如果我提供了一个包含库和标题的库,我如何向库的用户提供调试符号?

64465 次浏览

静态库被实现到使用它们的程序中。

如果使用它们的程序正在使用调试符号,则该程序中已编译的库代码也将具有符号。

来自维基百科的 PDB 信息:

当调试符号嵌入到二进制文件本身中时,文件可以 然后显著增大(有时增大几兆字节) 避免这种额外的大小、现代编译器和早期的大型机调试 系统将符号信息输出到一个单独的文件中; Microsoft 编译器,此文件称为 PDB 文件。

如果使用 /ZI/Zi(C/C++-> General-> Debug Information Format) ,那么就创建了 vc$(PlatformToolsetVersion).pdb,其中包含了所有创建的 .obj文件的调试信息。如果交替使用 /Z7,则调试信息将嵌入到 .obj文件中,然后嵌入到 .lib中。这可能是分发 /Zi0调试信息最简单的方法。

但是,我不建议发布静态库,因为它通常与编译器的特定版本绑定在一起。

我注意到在 VS2013中可以在 C/C + + Output Files 选项卡中设置程序数据库文件名。将它从默认设置更改为类似 $(OutDir) $(TargetName) . pdb的设置可以解决这个问题

VS2012里的奇怪行为。从头开始构建(或在 nmake 中使用/A 选项)将产生一个。PDB 档案。现在删除。Lib 和。Pdb 并重新运行 nmake (当然不包括/A,只运行 link)和 no。输出 pdb 文件。

扩展以前的答案,为那些需要完整的如何(VS 2013最低)。

注意,这应该解决上面关于 VS2013问题的注释 ^ ^ 。

方法1: 程序数据库(. pdb)方法(/ZI 或/ZI)

  1. 静态库项目: < em > 生成一个与静态库同名的 pdb:

    • View菜单中打开 Solution Explorer
    • 右键单击静态库项目,选择 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 文件链接起来:

    • 同样,导航到项目属性,但这次是您的 Application 项目
    • 同样,根据需要编辑 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. 静态库项目: < em > 生成具有嵌入式调试符号的静态库

    • 与方法1一样,导航到项目属性
    • 与方法1一样,修改您的 Debug Information但这次是去 /Z7
    • 与方法1一样,编译并注意 YourLib.lib 是在哪里生成的。
  2. Application Project: < em > 用静态库链接可执行文件

    • 与方法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”选择也适用于应用程序项目。