在VS2010中,有一个选项可以为链接器下的exes / dll生成调试信息,但是对于libs, librarian 下没有这样的选项。调试信息是否嵌入在静态库中?
libs,exes和dll的程序库文件名的 C / C ++ 属性中有一个选项。默认情况下,它进入我的中间目录并被命名为libs的项目名称,但是为exes / dlls命名为 vc $(PlatformToolsetVersion).pdb 。这个选项的pdb是什么,它与链接器选项中的pdb有什么不同?
如果我提供带有库和头文件的库,如何向我的库用户提供调试符号?
答案 0 :(得分:49)
如果您使用/ZI
或/Zi
(C/C++
- > General
- > Debug Information Format
),则会创建vc$(PlatformToolsetVersion).pdb
,其中包含所有创建的.obj
文件的调试信息。如果您使用/Z7
,则调试信息将嵌入到.obj
文件中,然后嵌入到.lib
中。这可能是分发静态库的调试信息的最简单方法。
但是,我不建议分发静态库,因为它通常与编译器的特定版本相关联。
答案 1 :(得分:34)
扩展之前的答案,适用于需要完整操作方法的人(VS 2013)。
请注意,这应该针对VS2013问题发表上述评论^^。
方法1:程序数据库(.pdb)方式(/ Zi或/ ZI)
Static Lib Project:生成一个与静态lib同名的pdb:
Solution Explorer
菜单中打开View
。Properties
Configuration Properties
- > C/C++
- > General
- > Debug Information
至/Zi
或/ZI
/ZI
允许"编辑并继续"在调试期间编辑Configuration Properties
- > C/C++
- > Output Files
- > Program Database File Name
至$(OutDir)$(TargetName).pdb
应用程序项目:将您的可执行文件与静态库和新的PDB文件链接:
Debug Information
属性。Configuration Properties
- > Linker
- > General
- > Additional Library Directories
,添加您自己的" libs"目录,或您计划保留/复制YourLib.lib和YourLib.pdb文件的任何目录。Configuration Properties
- > Linker
- > Input
- > Additional Dependencies
,添加YourLib.lib
(前面没有路径)方法2:嵌入式符号(无.pdb)方式(/ Z7)
Static Lib Project:生成带有嵌入式调试符号的静态库
Debug Information
,,但这次是/Z7
应用程序项目:将您的可执行文件链接到静态库
Debug Information
属性Additional Library Directories
Additional Dependencies
Additional Library Directories
<强>讨论:强>
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文件。