cl.exe が壊れたバイナリしか出力しない


Windows の MSVC を初めて使用します。 ( macOS/Linux で GCC/Clang は使ったことがあります)  
簡単な次のファイルを cl.exe でコンパイルしようと思います。

prog.c

[code]

    #include <stdio.h>
    
    int main(int argc,char* argv[]) {
    
        printf("Hello world\n");
        return 0;
    
    }
    
[/code]

コンパイルのコマンドは

[code]

    cl.exe /EHsc /Feprog.exe prog.c
    
[/code]

すると、 prog.obj と prog.exe が特に問題なく生成されたように思われます。  
ところが prog.exe は実行できません。 prog.exe の内容を Hex 表示すると 000000 (ヌル文字)
がひたすら続くファイルになっています。  
どうしたら適切に実行できるバイナリが生成できるか教えていただけませんでしょうか。

インストールした開発環境

  * MSVC v143 x64/x86 ビルド
  * Visual Studio Community 2022
  * Windows 10 SDK (10.0.19041.0)
  * Windows 11 21H2

## 追記

情報が不足していて申し訳ありません。

  * 作業環境は Visual Studio Code で、統合ターミナルから次の batch ファイルを実行してコマンドプロンプトを開きました

[code]

    @echo off
    %COMSPEC% /k "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvars64.bat"
    
[/code]

このコマンドプロンプト内で `cl.exe /EHsc /Feprog.exe prog.c` を実行しています。

  * Developer Command Prompt / Developer PowerShell でも試してみましたが同様の結果です。 `.\prog.exe` に対して `指定されたプログラムは実行できません。` と返ってきます。

  * `cl.exe` の出力メッセージは次の通りです

[code]

    Microsoft(R) C/C++ Optimizing Compiler Version 19.31.31104 for x86
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    prog.c
    Microsoft (R) Incremental Linker Version 14.31.31104.0
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    /out:prog.exe 
    prog.obj
    
    
[/code]

  * prog.obj はヌル文字のみのファイルではなかったので、 `link.exe` に問題があるんじゃないかと思っています。 `link.exe prog.obj /out:prog.exe` も試してみたら、毎度ヌル文字の prog.exe が生成されます。 link.exe の出力は次の通り。

[code]

    Microsoft (R) Incremental Linker Version 14.31.31104.0
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    
    
[/code]

  * `dir` の出力でディレクトリ構成を説明します。

[code]

     Directory of C:\Users\*\prog
    
    2022/02/24  12:18    <DIR>          .
    2022/02/24  12:17    <DIR>          ..
    2022/02/24  12:18           101,888 prog.exe
    2022/02/24  12:18                94 prog.c
    2022/02/24  12:18             1,433 prog.obj
                   3 File(s)        105,175 bytes
    
[/code]

  * 基本的に Visual Studio を使わずに CLI 上でコンパイルを行いたいので、 Visual Studio の動作確認をあまりしていないのですが、動作確認はした方がよいのでしょうか。

## 追記2

  * ご指摘の通り、上記では間違って x86 の Developer Command Prompt を使っていました。確かに x64 だとこういう出力になります。

[code]

    Microsoft(R) C/C++ Optimizing Compiler Version 19.31.31104 for x64
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    prog.c
    Microsoft (R) Incremental Linker Version 14.31.31104.0
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    /out:prog.exe
    prog.obj
    
    
[/code]

どちらにしても壊れた実行ファイルが生成され続けます。  
Visual Studio 2022 を一旦削除して、再びインストールしてみたのですが、やはり変わっていません。

  * Visual Studio のプロジェクト (コンソール アプリ) を作って、特に書き換えずそのまま「デバッグなしで開始」を押してみたのですが

[code]

    プログラム `<実行ファイルの場所>` を開始できません。
    ファイルまたはディレクトリが壊れているため、読み取ることができません。
    
[/code]

というダイアログが表示されて実行できませんでした。

  * あとセキュリティソフトはインストールしていない環境です。インストールしているアプリの中から疑わしいものを探してみます。

  * Mac の MinGW-w64 の GCC で作成した実行ファイルを当該 Windows 環境に転送しても問題なく実行できました。




正体不明のエラーに付き合っていただきありがとうございました。  
色々調べる中で原因がなんとなくわかった気がします。

ここまで説明しなかったのですが、当該 Windows 環境は VMWare Fusion の仮想マシンでした。  
prog.c, prog.exe などが VMWare の共有ディレクトリ (vmware-host)
に存在していたことが原因のようです。これらのディレクトリを仮想マシンのストレージ (C:) に移動させたところ、問題なくコンパイルできました。

VMWare のコミュニティでも似た質問? をしている方がおられました:  
<https://communities.vmware.com/t5/VMware-Workstation-Pro/Visual-Studio-cl-
exe-in-guest-OS-bad-performance/td-p/1913013>

質問でディレクトリの場所を `C:/Users/*/prog` としていたのは、C: 中に vmware-host
へのリンクを張り、そちらを介してアクセスしていたためです。混乱された方がいらっしゃったらすみません。




正体不明のエラーに付き合っていただきありがとうございました。  
色々調べる中で原因がなんとなくわかった気がします。

ここまで説明しなかったのですが、当該 Windows 環境は VMWare Fusion の仮想マシンでした。  
prog.c, prog.exe などが VMWare の共有ディレクトリ (vmware-host)
に存在していたことが原因のようです。これらのディレクトリを仮想マシンのストレージ (C:) に移動させたところ、問題なくコンパイルできました。

VMWare のコミュニティでも似た質問? をしている方がおられました:  
<https://communities.vmware.com/t5/VMware-Workstation-Pro/Visual-Studio-cl-
exe-in-guest-OS-bad-performance/td-p/1913013>

質問でディレクトリの場所を `C:/Users/*/prog` としていたのは、C: 中に vmware-host
へのリンクを張り、そちらを介してアクセスしていたためです。混乱された方がいらっしゃったらすみません。

