C++ 静态库调试符号
在VS2010中,在linker下有一个为EXE/DLL生成调试信息的选项,但在libs的Library下没有这样的选项。调试信息是否嵌入到静态库中 在C/C++属性中有一个选项,用于libs、exe和dll的程序数据库文件名。默认情况下,它进入我的中间目录,并被命名为libs的项目名称,但被命名为vc$(PlatformToolsetVersion).pdb,用于exes/dll。此选项中的pdb是什么?它与链接器选项中的pdb有何不同C++ 静态库调试符号,c++,visual-studio,visual-studio-2010,C++,Visual Studio,Visual Studio 2010,在VS2010中,在linker下有一个为EXE/DLL生成调试信息的选项,但在libs的Library下没有这样的选项。调试信息是否嵌入到静态库中 在C/C++属性中有一个选项,用于libs、exe和dll的程序数据库文件名。默认情况下,它进入我的中间目录,并被命名为libs的项目名称,但被命名为vc$(PlatformToolsetVersion).pdb,用于exes/dll。此选项中的pdb是什么?它与链接器选项中的pdb有何不同 如果我提供一个带有lib和header的库,如何向库的用
如果我提供一个带有lib和header的库,如何向库的用户提供调试符号?静态库被实现到使用它们的程序中 如果使用它们的程序正在使用调试符号,则该程序中编译的库代码也将具有符号 维基百科的PDB信息: 当调试符号嵌入二进制文件本身时,文件可以 然后变得更大(有时是几兆字节)。到 避免这种额外的大小、现代编译器和早期大型机调试 系统将符号信息输出到单独的文件中;对于 Microsoft编译器,此文件称为PDB文件
如果使用
/ZI
或/ZI
(C/C++
->常规->调试信息格式
),则会创建vc$(PlatformToolsetVersion).pdb
,其中包含所创建的所有.obj
文件的调试信息。如果交替使用/Z7
,调试信息将嵌入.obj
文件,然后嵌入.lib
。这可能是分发静态库调试信息的最简单方法
但是,我不建议分发静态库,因为它通常与编译器的特定版本相关联。我注意到在VS2013中,可以在C/C++输出文件选项卡中设置程序数据库文件名。将其从默认值更改为类似于$(OutDir)$(TargetName).pdb解决了VS2012中的奇怪行为问题。从头开始构建(或在nmake中使用/A选项)将生成一个.pdb文件。现在删除.lib和.pdb并重新运行nmake(当然不带/A,只运行链接),并且不输出.pdb文件。根据前面的答案展开,适用于需要完整操作方法的用户(至少是2013年)
请注意,这应解决上述有关VS2013问题的意见
方法1:程序数据库(.pdb)方式(/Zi或/Zi)
静态库项目:生成与静态库同名的pdb:
- 从
视图
菜单打开解决方案资源管理器
- 右键单击静态库项目,选择
Properties
- 编辑
配置属性
->C/C++
->常规
->调试信息
至/Zi
或/Zi
- 请注意,
/ZI
允许在调试期间进行“编辑并继续”编辑
- 编辑
配置属性
->C/C++
->输出文件
->程序数据库文件名
到$(OutDir)$(TargetName).pdb
- 现在编译它,并注意YourLib.lib和YourLib.pdb的位置
应用程序项目:将可执行文件与静态库和新PDB文件链接:
- 再次导航到项目属性,但这次是针对您的应用程序项目
- 再次,根据需要编辑
调试信息
属性
- 编辑
配置属性
->链接器
->常规
->其他库目录
,添加您自己的“libs”目录,或添加您计划保留/复制YourLib.lib和YourLib.pdb文件的任何目录
- 编辑
配置属性
->链接器
->输入
->其他依赖项
,添加YourLib.lib
(前面没有路径)
- 现在将YourLib.lib和YourLib.pdb复制到上面指定的目录中
方法2:嵌入符号(编号pdb)方式(/Z7)
静态库项目:生成带有嵌入式调试符号的静态库
- 与方法1一样,导航到项目属性
- 与方法1一样,修改
调试信息,,但这次修改为/Z7
- 与方法1一样,编译并记录YourLib.lib的生成位置
应用程序项目:将可执行文件链接到静态库
- 与方法1一样,导航到项目属性
- 与方法1一样,根据需要修改
调试信息
属性
- 与方法1一样,编辑
其他库目录
- 与方法1一样,编辑
其他依赖项
- 现在将YourLib.lib复制到
其他库目录中指定的目录中
讨论:
- Z7的优点?它更简单,而且是“单文件”方式。所有调试信息都在lib文件中
- Z7的缺点?磁盘上的文件大小、链接时间、与“最小重建”(/Gm)功能不兼容、不允许“编辑并继续”、较旧的格式(例如较旧的范例)
- 为什么我不为应用程序项目指定
调试信息
设置?这篇文章关注的是如何在静态lib代码中进行调试。同样的“方法1 vs方法2”选择也适用于应用程序项目
我认为这是正在发生的事情,但这似乎是错误的。我收到VS警告,说链接到静态库时找不到PDB。此外,对于EXE/DLL,VS产生2个PDB;我不知道这些看起来是什么意思