【发布时间】: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