在不中断引用的情况下移动静态库的 *.pdb 文件 - LNK4099
Move *.pdb file for static library without breaking references - LNK4099
我在一个名为<libraryBuildDir>
的文件夹中构建了第三方静态库,并将生成的 *.lib 文件复制到我的项目文件夹结构中。除了 *.lib,我还放置了 *.pdb 文件。然后我删除了<libraryBuildDir>
,假设不再需要它。这是以前对其他库有效的方法,它遵循了似乎是常见的做法。
但是,当我在调试配置中构建项目时,我会收到许多LNK4099警告,如下所示(大致翻译(:
<myLib>.lib(<someObjFromTheLib>.obj) : warning LNK4099: PDB "<myLib>.pdb" was not found alongside "<myLib.lib>" or "<myBuildDir>". Linking without debug info
我验证了 *.pdb 文件就在 *.lib 文件旁边。 作为测试,我按照警告的建议将其直接放入构建目录中。现在我得到很多这样的LNK4204:
<myLib>.lib(<someObjFromTheLib>.obj) : warning LNK4204: "<myBuildDir><myLib>.pdb" is missing debugging information for referencing module; linking object as if no debug info
我按照此建议提取了警告中出现的一个对象文件(<someObjFromTheLib>.obj
(。我注意到提取的 *.obj 文件不包含Debug$T
部分。
因此,显然当我将 *.pdb 文件从<libraryBuildDir>
复制到我的项目时,我断开了一些指向其他调试符号文件的链接,这些文件现在不再可用,因为我删除了<libraryBuildDir>
.这让我觉得我的整个过程是错误的。
我的目标:使用调试符号编译静态库,并将完成的 *lib 文件移动到另一个项目。然后编译另一个项目,并包含静态库中的完整调试符号。
如何在不中断任何引用的情况下将 pdb 文件从临时库构建目录移动到另一个目录?
(旁注:我正在使用 cmake 编译 Crypto++ v8.2.0,*.pdb 文件被称为cryptopp-object.pdb
而库被称为cryptopp-static.lib
。这违背了 *.lib 和 *.pdb具有相同名称的约定,但这是 Crypto++ 的配置方式,如果可能的话,我不想更改它。但是,*.lib 文件似乎需要其 pdb 文件的正确名称,因此我认为这很好。
(另外:lib /list <myLib>.lib
列出了很多 *.obj 文件,其中只有其中一些出现在我的LNK4099警告中,而其他文件则没有。我不知道这是否意味着它们根本没有在我的项目中使用,或者它们是否具有所有可用的调试信息。
事实证明,如果我从完全相同的运行中重新编译并复制 lib 和 pdb,问题似乎消失了。
为什么结果不是确定性的?
a( 因为 PDB 包含一个时间戳,而该时间戳在不同的版本中很少相同
b( 因为现在的构建可以是多线程的,因此会导致不同的结果,具体取决于首先编译的内容。
c( "相同"的代码(关于行为(可能会产生不同的 AST,例如,如果您只是移动方法。
如何在不中断任何引用的情况下将 pdb 文件从临时库构建目录移动到另一个目录?
只要 PDB 与生成匹配,就应该可以。但是,请考虑使用 PDB 的/Fd 选项和 OBJ 的/Fo 选项构建到所需的目录中。
解决方案:构建不是确定性的。*.pdb 和 *.lib 文件必须来自完全相同的"构建"。
- 加载"D:UsersPublicDocumentsopencvbuildx64vc14binopencv_world340d.dll",找不到或打开PDB文件
- OpenCV 3 Visual Studio 2017 调试,调用堆栈没有.pdb文件
- 删除编译器优化并在发布中启用 pdb 文件
- 在不中断引用的情况下移动静态库的 *.pdb 文件 - LNK4099
- 从远程服务器请求PDB文件
- nvoglv32.dll 找不到或打开 PDB 文件
- 如何将信息插入 pdb 文件
- 如何让CMAKE安装目标PDB文件
- C Microsoft Visual Studio 2015调试问题(找不到或打开PDB文件.)
- Windows 10中的Visual Studio 2012:找不到或打开PDB文件
- 找不到或无法打开Visual studio 2012的PDB文件
- 找不到"mpiexec"的调试信息或不匹配。找不到或打开 PDB 文件
- 在没有PDB文件的情况下,是否可以在Windows上获得堆栈跟踪?如果是,如何
- 如何在Visual Studio中生成一个具有随机输出名称的PDB文件
- 使用 dll、pdb 文件和源在 VS C++ 中调试
- windbg 和 VS 找不到我的 pdb 文件
- 如何在使用 MINGW 构建库时生成 PDB 文件
- "The breakpoint will not currently be hit" - 我无法添加.pdb文件
- opencv_core2410.dll - 找不到或打开 PDB 文件
- 为什么在不同的文件夹上创建 EXE 和 PDB 文件