2016-01-27 66 views
0

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

+0

貌似CMake的是此无关,因为它增加了'/ FS'标志自动地(在'-c'之前)。类似的问题:http://stackoverflow.com/questions/20643370/visual-studio-2013-fatal-error-c1041-fs。可能有些外部进程会锁定你的'.pdb'文件。什么样的驱动器是'Z:/'? – Tsyvarev

+0

是的,我注意到了/ FS,但我认为我会添加它作为一个完整性检查。我探讨了这些解决方案。看起来每个项目都有一个中间目录,例如'detours.dir',在这种情况下,我只编译一个项目。它看起来像.cpp文件争夺.pdb,这是有道理的,因为它们以后都会属于同一个可执行文件。我在编译时试图用ProcessExplorer搜索句柄,但还没有运气。 – clark

回答

0

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

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

步骤

  1. 断开网络映射从内部VM从VirtualBox的
  2. 删除共享文件夹设置
  3. 安装一个Windows共享主机(右键点击文件夹 - >共享)
  4. 地图这个份额,在VM
+0

在非本地驱动器上构建可能会导致未知错误并不罕见。 Virtual Box共享文件夹可能不支持文件锁定,或者以非常简单的方式支持。这不是MSVC和'/ FS'选项实现的问题。这只是Virtual Box的一个限制,不太可能在不久的将来得到修复。 – Tsyvarev