2016-01-27 61 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