静态库debugging符号
在VS2010中,有一个选项可以为链接器下的exes / dll生成debugging信息,但是在库pipe理器下没有这样的选项。 debugging信息embedded在静态库中吗?
在程序数据库文件名的libs,exes和dll的C / C ++属性中有一个选项。 默认情况下,它进入我的中间目录,并命名为libs的项目名称,但exes / dll命名为vc $(PlatformToolsetVersion).pdb 。 这个选项的pdb是什么,它和链接器选项中的pdb有什么不同?
如果我正在提供库和头文件,我该如何提供debugging符号给我的库的用户?
如果使用/ZI
或/Zi
( C/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)
-
静态库项目: 生成与静态库名称相同的pdb:
- 从
View
菜单打开Solution Explorer
- 右键单击您的静态lib项目,select
Properties
- 编辑
Configuration Properties
– >C/C++
– >General
– >Debug Information
到/Zi
或/ZI
- 请注意,在debugging过程中
/ZI
允许编辑和继续编辑
- 请注意,在debugging过程中
- 编辑
Configuration Properties
– >C/C++
– >Output Files
– >Program Database File Name
到$(OutDir)$(TargetName).pdb
- 现在编译它,并记下YourLib.lib和YourLib.pdb的位置。
- 从
-
应用程序项目: 链接您的可执行文件与静态库和新的PDB文件 :
- 再次,导航到项目属性,但这次,为您的应用程序项目
- 再次,根据需要编辑
Debug Information
属性。 - 编辑
Configuration Properties
– >Linker
– >General
– >Additional Library Directories
,添加您自己的“库”目录,或任何您打算保留/复制YourLib.lib和YourLib.pdb文件的目录。 - 编辑
Configuration Properties
– >Linker
– >Input
– >Additional Dependencies
,添加YourLib.lib
(前面没有path) - 现在将YourLib.lib和YourLib.pdb复制到上面指定的目录中。
方法2:embedded的符号(无.pdb)方式(/ Z7)
-
静态库项目: 生成一个embedded式debugging符号的静态库
- 如方法1中,导航到项目属性
- 如在方法1中一样,修改您的
Debug Information
, 但这次是/Z7
- 如在方法1中一样,编译并loggingYourLib.lib的生成位置。
-
应用程序项目: 链接你的可执行文件与静态库
- 如方法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文件。