我有一个简单的 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
实际上没有同步锁。