我有一个简单CMakeLists编译弯路表达PDB同步写入错误
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:\是我安装的共享文件夹。 我已经确保在虚拟机和主机中禁用Windows Defender,并卸载主机上的第三方AV。
更新2
我发现,避免症状的解决办法,并增加一条,作为一个答案,但它仍然没有解释为什么/FS
实际上并没有同步锁。
貌似CMake的是此无关,因为它增加了'/ FS'标志自动地(在'-c'之前)。类似的问题:http://stackoverflow.com/questions/20643370/visual-studio-2013-fatal-error-c1041-fs。可能有些外部进程会锁定你的'.pdb'文件。什么样的驱动器是'Z:/'? – Tsyvarev
是的,我注意到了/ FS,但我认为我会添加它作为一个完整性检查。我探讨了这些解决方案。看起来每个项目都有一个中间目录,例如'detours.dir',在这种情况下,我只编译一个项目。它看起来像.cpp文件争夺.pdb,这是有道理的,因为它们以后都会属于同一个可执行文件。我在编译时试图用ProcessExplorer搜索句柄,但还没有运气。 – clark