我有一个简单的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
抛出
失败: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 .. \分机\ 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&#39 ;;如果多个CL.EXE写入相同的.PDB文件,请使用/ FS
如果我重新运行ninja detours
,那么接下来的3个cpp文件会发生同样的情况,然后是接下来的2个,然后是最后一个,然后项目就完全编译了。
如果我运行ninja -j1 detours
那么就没有问题,因为我只是禁用了并行构建。
为什么它似乎忽略了我的/ FS选项? 我使用的是Visual Studio 2013。
更新1
这是在Virtualbox 4.3.10中的虚拟机内部,带有Guest Additions。 Z:\是我挂载的共享文件夹。 我确保在VM和主机中禁用Windows Defender,并在主机上卸载第三方AV。
更新2
我找到了一种可以避免症状并将其作为答案添加的解决方法,但它仍然无法解释为什么/FS
实际上并未同步锁。
答案 0 :(得分:0)
与解决方案不同的是解决方案。似乎VirtualBox用于实现共享文件夹的任何机制都是罪魁祸首。我用Windows共享文件夹替换了虚拟框共享文件夹,我不再收到这些错误。
奇怪的是,顺序构建不会导致这些错误,可能编译第一个文件会导致同步阻止其他文件锁定直到完成,并且因为构建是并行的其他.cpp文件进入锁。我不确定这是否是VirtualBox或MSVC的错误,因为这似乎是/FS
应该修复的那种问题。
<强>步骤强>