我有一個簡單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