標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

(事例)ネットワークフォルダーをシンボリックリンクで参照すると Visual C++ が内部エラーを起こす

自分の中では常識になってるけど、一般にこれを記した文書はないようだ。誰かが困った時のために記事にしておこう。自分は

cd %USERPROFILE%
mklink /D Share "\\vmware-host\Shared Folders\Share"

などとして、ネットワークフォルダーをユーザのホームディレクトリにシンボリックリンクでつなげている。

こういうのは通常ネットワークドライブを用いるものだが、 ネットワークドライブだと管理者権限に昇格したセッションにドライブのマウントが引き継がれないという問題※がある。が、これなら物理的なリンクなので、どのセッションでも同様に参照できる (※ レジストリを設定すると回避できるという話だが、Windows 8.1 だとそういうのが効かない場合がある、というか効かなかった)

ただこうすると、そのリンクしたフォルダーツリーの下においた Visual C++ のソリューションがビルドで内部エラーを起こす(発生するメッセージは様々)。おそらくは、ネットワークフォルダーをあたかもローカルフォルダーに見せかけていているせいで、VC++ がフォルダー・ファイルがネットワークフォルダーにあると認識できず、本来ローカルフォルダーにしか使えないはずの API を使ってしまっているのだろう。同じフォルダーを net use Z: "\\vmware-host\Shared Folders" のように、ネットワークドライブ経由でアクセスした場合、同エラーはまったく発生しない。

ちなみに .NET のソリューションだと、コンパイラが違うせいか、このような問題は発生しない。また、これらの問題は VMware 内の Windows の共有フォルダーでしか確認していない。他の物理ファイルサーバー上で発生するかどうか検証していないので、もしかしたら VMware の問題かもしれない。

追記

  • mklink /D "%USERPROFILE%\Share" "\\vmware-host\Shared Folders\Share" (~\Share)
  • net use Z: "\\vmware-host\Shared Folders" (Z:)

とかしていると、ついうっかりと ~\Share で作業してしまうんだけど、ここで作業すると Visual C++ でエラーになる。Z: に移動して作業したいが、いちいち pwd | clip してから、パスを加工して cd するのは面倒だ。

という場合のために、nyagos の関数を書いた。zz というコマンドでシンボリックリンクディレクトリから Z: ドライブの同じ位置に移動する。

nyagos.alias.zz = function()
    local share = nyagos.pathjoin(os.getenv("USERPROFILE"),"Share")
    local wd = nyagos.getwd()
    local share_len = string.len(share)

    if string.sub(string.upper(wd),1,share_len) == string.upper(share) then
        local newdir = nyagos.pathjoin(
            "Z:\\Share", string.sub(wd,share_len+1))
        nyagos.chdir(newdir)
    end
end