静态库调试符号

时间:2011-09-27 20:34:01

标签: c++ visual-studio visual-studio-2010

在VS2010中,有一个选项可以为链接器下的exes / dll生成调试信息,但是对于libs, librarian 下没有这样的选项。调试信息是否嵌入在静态库中?

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

如果我提供带有库和头文件的库,如何向我的库用户提供调试符号?

5 个答案:

答案 0 :(得分:49)

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

但是,我不建议分发静态库,因为它通常与编译器的特定版本相关联。

答案 1 :(得分:34)

扩展之前的答案,适用于需要完整操作方法的人(VS 2013)。

请注意,这应该针对VS2013问题发表上述评论^^。

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

  1. Static Lib Project:生成一个与静态lib同名的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 复制到您指定的目录。
  3. 方法2:嵌入式符号(无.pdb)方式(/ Z7)

    1. Static Lib Project:生成带有嵌入式调试符号的静态库

      • 与方法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
      • 中指定的目录
    3. <强>讨论:

      • Z7的优点?它更简单,而且单个文件&#34;这样做的方式。所有调试信息都在lib文件中。
      • Z7的缺点?磁盘上的文件大小,链接时间,与&#34;最小化重建&#34;不兼容(/ Gm)功能,允许&#34;编辑并继续&#34;,较旧的格式(例如较旧的范例)
      • 为什么我没有指定Debug Information应用程序项目的设置?这篇文章关注如何在静态lib代码中进行调试。相同的&#34;方法1对比方法2&#34;选择也适用于Application项目。

答案 2 :(得分:17)

我注意到在VS2013中可以在C / C ++输出文件选项卡中设置程序数据库文件名。将其从默认值更改为 $(OutDir)$(TargetName).pdb 可解决此问题

答案 3 :(得分:5)

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

如果使用它们的程序使用调试符号,那么该程序中编译的库代码也会有符号。

来自维基百科的PDB信息:

  

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

答案 4 :(得分:1)

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