静态库调试符号

Dav*_*vid 63 c++ visual-studio-2010 visual-studio

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

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

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

小智 51

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

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

  • @mloar关于你的最后一段,是不是dll也绑定到特定的编译器版本?(http://stackoverflow.com/questions/3427885/make-visual-studio-not-care-about-dll-versions) (3认同)
  • C++ DLL特定于编译器版本. (3认同)
  • 由于某种原因,这似乎对VS 2013没有用.VS无法加载.lib文件源的调试信息.我有.lib和.exe项目的/ Z7,以及我的.exe项目链接选项中的/ debug. (2认同)

bun*_*ive 36

对于那些需要完整操作方法的人(VS 2013),扩展了之前的答案.

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

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

  1. Static Lib Project:生成一个与静态lib同名的pdb:

    • Solution ExplorerView菜单打开.
    • 右键单击您的静态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文件链接:

    • 再次,导航到项目属性,但这次是针对您的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. 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

讨论:

  • Z7的优点?它更简单,并采用"单文件"方式.所有调试信息都在lib文件中.
  • Z7的缺点?文件大小在磁盘上,连接时间,用"最少重建"(/ GM)功能,兼容容许"编辑并继续",旧的格式(例如,旧的范式)
  • 为什么我不指定Debug Information应用程序项目的设置?这篇文章关注如何在静态lib代码中进行调试.相同的"方法1与方法2"选项也适用于应用程序项目.


小智 17

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


Pub*_*bby 5

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

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

来自维基百科的PDB信息:

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

  • 这就是我认为会发生的事情,但这似乎是错误的.我收到VS警告说在链接到静态库时无法找到PDB.此外,对于exes/dlls VS产生2个PDB; 我不知道中间目录中看似毫无意义的那个是什么,但这只是**为静态库生成的**,而且是与exes/dlls不同的名称. (5认同)
  • 为静态库生成的唯一PDB(在中间目录中)是将dll/exe与此静态库链接时所需的调试信息.如果您在同一台机器上同时构建所有静态库和dll/exe并且在构建后不移动目录,则可以很好地找到这些PDB并将调试信息包含在exes/dll中.如果您移动目录,或在另一台计算机上构建静态库,则VS无法找到静态库的PDB并生成警告. (4认同)