静态库debugging符号

在VS2010中,有一个选项可以为链接器下的exes / dll生成debugging信息,但是在库pipe理下没有这样的选项。 debugging信息embedded在静态库中吗?

程序数据库文件名的libs,exes和dll的C / C ++属性中有一个选项。 默认情况下,它进入我的中间目录,并命名为libs的项目名称,但exes / dll命名为vc $(PlatformToolsetVersion).pdb 。 这个选项的pdb是什么,它和链接器选项中的pdb有什么不同?

如果我正在提供库和头文件,我该如何提供debugging符号给我的库的用户?

如果使用/ZI/ZiC/C++ – > General – > Debug Information Format ),则会创buildvc$(PlatformToolsetVersion).pdb ,其中包含所有创build的.obj文件的debugging信息。 如果交替使用/Z7 ,debugging信息将被embedded到.obj文件中,然后embedded到.lib 。 这可能是分发静态库的debugging信息的最简单的方法。

我不会build议分发一个静态库,但是,因为它通常绑定到特定版本的编译器。

对于那些需要完整的指导(VS 2013)的人来说,扩展以前的答案。

请注意,这应该解决上面有关VS2013问题的意见^^。

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

  1. 静态库项目: 生成与静态库名称相同的pdb:

    • View菜单打开Solution Explorer
    • 右键单击您的静态lib项目,selectProperties
    • 编辑Configuration Properties – > C/C++ – > General – > Debug Information/Zi/ZI
      • 请注意,在debugging过程中/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 ,添加您自己的“库”目录,或任何您打算保留/复制YourLib.lib和YourLib.pdb文件的目录。
    • 编辑Configuration Properties – > Linker – > Input – > Additional Dependencies ,添加YourLib.lib (前面没有path)
    • 现在将YourLib.libYourLib.pdb复制到上面指定的目录中。

方法2:embedded的符号(无.pdb)方式(/ Z7)

  1. 静态库项目: 生成一个embedded式debugging符号的静态库

    • 如方法1中,导航到项目属性
    • 如在方法1中一样,修改您的Debug Information但这次是/Z7
    • 如在方法1中一样,编译并loggingYourLib.lib的生成位置。
  2. 应用程序项目: 链接你的可执行文件与静态库

    • 如方法1中,导航到项目属性
    • 如在方法1中,根据需要修改您的Debug Information属性
    • 如在方法1中一样,编辑Additional Library Directories
    • 如在方法1中一样,编辑Additional Dependencies
    • 现在将YourLib.lib复制到Additional Library Directories目录中指定的Additional Library Directories

讨论:

  • Z7的优点? 这很简单,而且是“单一文件”的方式。 所有的debugging信息都在lib文件中。
  • Z7的缺点? 与“最小重build”(/ Gm)function不兼容的磁盘上的文件大小,链接时间不允许“编辑并继续”,较旧的格式(例如较旧的范例)
  • 为什么我不指定应用程序项目的Debug Information设置? 这篇文章是关于如何在静态lib代码中debugging工作。 同样的“方法1与方法2”select同样适用于应用程序项目。

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

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

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

来自维基百科的PDB信息:

当debugging符号embedded到二进制文件本身,文件可以增长得更大(有时几兆字节)。 为了避免这个额外的大小,现代编译器和早期的大型机debugging系统将符号信息输出到一个单独的文件中; 对于Microsoft编译器,这个文件被称为PDB文件。

在VS2012奇怪的行为。 从头开始构build(或使用nmake中的/ A选项)将生成.pdb文件。 现在删除.lib和.pdb,然后重新运行nmake(当然没有/ A,只运行链接)并且不输出.pdb文件。