【问题标题】:PDB synchronous write errors even with /FS即使使用 /FS,PDB 同步写入错误
【发布时间】:2016-05-05 02:48:36
【问题描述】:

我有一个简单的CMakeLists来编译detours express

project(detours)
add_library(detours STATIC detours.cpp disasm.cpp image.cpp modules.cpp creatwth.cpp)
file(COPY detours.h detver.h DESTINATION ${CMAKE_BINARY_DIR}/include)

必要的标志在上层 CMakeLists 中设置

add_definitions(-DDETOURS_X86 -DDETOURS_32BIT)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /FS")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /FS")

然而,当尝试在detours.cpp throws 之后编译每个 .cpp 文件的调试版本时

失败:C:\PROGRA~2\MICROS~1.0\VC\bin\cl.exe /nologo /TP -DDETOURS_32BIT -DDETOURS_X86 -Iinclude /DWIN32 /D_WINDOWS /W3 /GR /EHsc /FS /D_DEBUG /MDd / Zi /Ob0 /Od /RTC1 /showIncludes /Foext\detours_express_3.0\src\CMakeFiles\detours.dir\modules.cpp.obj \Fdext\detours_express_3.0\src\CMakeFiles\detours.dir\ /FS -c .. \ext\detours_express_3.0\src\modules.cpp ..\ext\detours_express_3.0\src\modules.cpp : 致命错误 C1041: 无法打开程序数据库 'z:\repo\src\ext\detours_express_3.0\src\cmakefiles\detours.dir\vc120.pdb';如果多个 CL.EXE 写入同一个 .PDB 文件,请使用 /FS

如果我重新运行ninja detours,那么接下来的 3 个 cpp 文件也会发生同样的情况,然后是接下来的 2 个,然后是最后一个,然后项目就被完全编译了。

如果我运行 ninja -j1 detours 则没有问题,因为我只是禁用了并行构建。

为什么它似乎忽略了我的 /FS 选项? 我正在使用 Visual Studio 2013。

更新 1

这是在 Virtualbox 4.3.10 的虚拟机中,带有来宾添加。 Z:\ 是我挂载的共享文件夹。 我已经确保在虚拟机和主机中禁用 Windows Defender,并在主机上卸载了第三方 AV。

更新 2

我找到了一种避免这些症状的解决方法并将其添加为答案,但它仍然无法解释为什么 /FS 实际上并未同步锁。

【问题讨论】:

  • 看起来 CMake 在这里是不相关的,因为它会自动添加 /FS 标志(就在 -c 之前)。类似问题:stackoverflow.com/questions/20643370/…。可能是某个外部进程锁定了您的 .pdb 文件。 Z:/是什么驱动器?
  • 是的,我注意到 /FS 但我想我会将它添加为健全性检查。我已经浏览了这些解决方案。看起来每个项目都已经有一个自己的中间目录,例如detours.dir,在这种情况下,我只编译一个项目。看起来 .cpp 文件正在争夺 .pdb,这是有道理的,因为它们稍后都属于同一个可执行文件。我在编译时尝试使用 ProcessExplorer 搜索句柄,但还没有运气。

标签: c++ visual-c++ cmake ninja


【解决方案1】:

与其说是一种解决方案,不如说是一种解决方法。看来,VirtualBox 用来实现共享文件夹的任何机制都是罪魁祸首。我用 windows 共享文件夹替换了虚拟框共享文件夹,我不再收到这些错误。

奇怪的是,顺序构建不会导致这些错误,也许编译第一个文件会导致同步,从而阻止其他文件在完成之前锁定,并且由于构建是并行的,其他 .cpp 文件会被锁定。不过,我不确定这是 VirtualBox 还是 MSVC 的错,因为这似乎是 /FS 应该解决的问题。

步骤

  1. 从 VM 中断开网络映射
  2. 从 VirtualBox 设置中删除共享文件夹
  3. 在主机上设置 Windows 共享(右键单击文件夹 -> 共享)
  4. 在 VM 中映射此共享

【讨论】:

  • 在非本地驱动器上构建会导致未执行的错误并不罕见。可能,Virtual Box 共享文件夹只是不支持文件锁定,或者以非常简化的方式支持它。这不是 MSVC 和 /FS 选项实现的问题。这只是 Virtual Box 份额的限制,不太可能在不久的将来修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多