Visual c++ 从发布的文件中删除PDB引用

Visual c++ 从发布的文件中删除PDB引用,visual-c++,reference,release,Visual C++,Reference,Release,在调试和创建带有任何IDE的文件后,我总是查看最终的二进制可执行文件或dll。现在我正在尝试Visual C++ 2010,在搜索最佳发布时,没有垃圾或不必要的引用。 因此,我用两个项目创建了一个新的解决方案:一个可执行文件和它的dll。VC++在代码和最终文件之间创建了许多中间文件。我用十六进制编辑器打开了.exe和.dll,看到了一些我不喜欢的东西文件中的某个地方有一个指向.PDB文件的绝对路径。 为什么??如何从VC++中删除它 为此,必须有一些预处理器命令。.PDB文件的绝对路径有什么用

在调试和创建带有任何IDE的文件后,我总是查看最终的二进制可执行文件或dll。现在我正在尝试Visual C++ 2010,在搜索最佳发布时,没有垃圾或不必要的引用。 因此,我用两个项目创建了一个新的解决方案:一个可执行文件和它的dll。VC++在代码和最终文件之间创建了许多中间文件。我用十六进制编辑器打开了.exe和.dll,看到了一些我不喜欢的东西文件中的某个地方有一个指向.PDB文件的绝对路径。

为什么??如何从VC++中删除它

为此,必须有一些预处理器命令。.PDB文件的绝对路径有什么用,例如文件二进制文件中的“D:\My Projects\Project1\Release\Project1.PDB”,该文件将分布在具有不同文件夹的计算机上?除此之外,我不喜欢看到我的驱动器路径保存在一个二进制文件中,我想与其他人共享。我处于发布模式,我看不到那些不必要的信息的使用。我怎样才能把它取下来?谢谢

阅读MSDN上的文档:

程序数据库(PDB)文件保存调试和项目状态信息,允许增量链接程序的调试配置。使用/ZI或/ZI编译C/C++程序或使用/debug编译Visual Basic/C#/JScript.NET程序时,将创建PDB文件

在VisualC++中,/FD选项命名编译器所创建的PDB文件。使用向导在Visual Studio中创建项目时,/Fd选项设置为创建名为project.PDB的PDB

请注意,文档中提到了绝对路径:

Visual Studio调试器直接使用链接器创建的project.PDB文件,并将PDB的绝对路径嵌入EXE或DLL文件中


您可以始终转到“项目属性”>“链接器”>“调试”>“生成调试信息”并将其设置为“否”。

您可以使用
/pdbpath:none
删除PDB文件的完整限定路径名,但只保留PDB的名称和扩展名。为发布的映像保留PDB的名称(和扩展名)是调试有缺陷映像的唯一方法。Windows映像几乎总是保留PDB的名称和扩展名

如果您无法重建模块(即,使用链接器开关/PDBPATH:NONE,Microsoft似乎已经取消了对该开关的支持),我为此编写了该工具,只要您不介意使用第三方工具。Peupdate可用于列出、删除或更改可执行模块中的PDB字符串。以下是一些例子:

peupdate -c <module_path>           //clear entire PDB path
peupdate -k <module_path>           //remove PDB path, but retain filename
peupdate -u <newpath> <module_path> //set your own path string
peupdate-c//清除整个PDB路径
peupdate-k//删除PDB路径,但保留文件名
peupdate-u//设置您自己的路径字符串

奇怪的是,即使我处于发布模式,仍会生成.PDB文件。谢谢你的帮助answer@ali:这是创建新项目时的默认设置。但是,您始终可以将其关闭。请注意,PDB仅用于调试和增量链接,您不需要发货(除非您希望您的客户能够调试)。好的。谢谢现在我改变了,它工作了!我讨厌看到字符串以二进制代码显示!本[问题][1]是否可能重复?您可以删除PDB的路径。但是,请保留PDB的参考资料。[1] :这是更好的解决方案,但是较新的版本重命名了该选项,您现在必须将
/pdbaltpath:%\u PDB%
传递给链接器。通常会提及与工具的关联。您的显示名称以及上面的链接表明存在此类关联。缺少关联已修复@0xC000002L;5年前,当我发布这个答案时,我是一个非常新手:)