2

我有一个简单的 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抛出后编译调试构建每个 .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:\ 是我挂载的共享文件夹。我已确保在 VM 和主机中禁用 Windows Defender,并在主机上卸载了第三方 AV。

更新 2

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

4

1 回答 1

0

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

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

脚步

  1. 从 VM 中断开网络映射
  2. 从 VirtualBox 设置中删除共享文件夹
  3. 在主机上设置 Windows 共享(右键单击文件夹 -> 共享)
  4. 在 VM 中映射此共享
于 2016-01-28T20:00:03.717 回答