2

迂回エクスプレスをコンパイルするための簡単なCMakeListsがあります

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 つ、最後の cpp ファイルで同じことが起こり、プロジェクトは完全にコンパイルされます。

ninja -j1 detours並列ビルドを無効にしただけなので、実行しても問題はありません。

/FS オプションを無視しているように見えるのはなぜですか? Visual Studio 2013 を使用しています。

更新 1

これは、ゲストが追加された Virtualbox 4.3.10 の VM 内にあります。Z:\ は、私がマウントした共有フォルダーです。VM とホストで Windows Defender を必ず無効にし、ホストでサードパーティの AV をアンインストールしました。

更新 2

/FS症状を回避する回避策を見つけて回答として追加しましたが、実際にロックを同期していない理由はまだ説明されていません。

4

1 に答える 1

0

回避策としての解決策ではありません。VirtualBox が共有フォルダーを実装するために使用するメカニズムが原因であるようです。仮想ボックス共有フォルダーを Windows 共有フォルダーに置き換えたところ、これらのエラーが発生しなくなりました。

シーケンシャル ビルドでこれらのエラーが発生しないのは奇妙です。おそらく、最初のファイルをコンパイルすると同期が発生し、それが完了するまで他のファイルがロックされなくなります。ビルドが並行しているため、他の .cpp ファイルがロックされます。/FSこれがVirtualBoxのせいなのかMSVCのせいなのかはわかりませんが、これは修正されるはずの問題のようなものです。

手順

  1. VM 内からネットワーク マップを切断する
  2. VirtualBox 設定から共有フォルダーを削除する
  3. ホストで Windows 共有をセットアップします (フォルダーを右クリック -> 共有)。
  4. この共有を VM にマップする
于 2016-01-28T20:00:03.717 に答える