Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 静态库调试符号_C++_Visual Studio_Visual Studio 2010 - Fatal编程技术网

C++ 静态库调试符号

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的库,如何向库的用

在VS2010中,在linker下有一个为EXE/DLL生成调试信息的选项,但在libs的Library下没有这样的选项。调试信息是否嵌入到静态库中

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


如果我提供一个带有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;我不知道这些看起来是什么意思