86566


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 環境に転送しても問題なく実行できました。


CC BY-SA 4.0
2022-02-24T00:22:01.867
86545
2022-02-25T00:33:36.173
2022-02-24T13:18:04.317
4236
47308
question
c windows visual-c++
cl.exe が壊れたバイナリしか出力しない


コメントの応答が返る前に取り敢えず回答します。  
コンパイルする前段階の作業が書かれていないのですが、この記事のように「開発者コマンド プロンプト」を起動していますか？  
[Visual
Studioを使いコマンドラインからC/C++のプログラムをコンパイルする](https://www.javadrive.jp/cstart/install/index5.html)  
記事はVisual Studio 2017のものですが、Visual Studio
2022でも同様のものか、あるいはスタートメニューの表示は英語のまま(Developer Command Prompt for VS
2022とか)のものがあるはずです。

そして記事に質問と同等/類似のソースコードが提示されていますが、この程度ならばそのコンパイル時にオプション等無くても実行ファイルは出来ます。

別に質問のオプション指定方法が間違っているとか問題があるとかでは無さそうですが、紹介記事のようにそのままソースコードだけ指定してみてはどうでしょう？

それが出来てから色々とオプションを試していくのが良いと思われます。  
[アルファベット順のコンパイラ オプション](https://docs.microsoft.com/ja-
jp/cpp/build/reference/compiler-options-listed-alphabetically?view=msvc-170)  
[カテゴリ別のコンパイラ オプション](https://docs.microsoft.com/ja-
jp/cpp/build/reference/compiler-options-listed-by-category?view=msvc-170)

* * *

作業環境を設定するバッチファイルが`vcvars64.bat`で、`cl.exe`の出力メッセージの最初の行に以下の`for
x86`が表示されるのは、整合性が取れていない感じがします。

[code]

    Microsoft(R) C/C++ Optimizing Compiler Version 19.31.31104 for x86
    
[/code]

この末尾が`for x86`になるのは、`Developer Command Prompt for VS 2022`の`VsDevCmd.bat`,
`x64_x86 Cross Tools Command Prompt for VS 2022`の`vcvarsamd64_x86.bat`, `x86
Native Tools Command Prompt for VS 2022`の`vcvars32.bat`あたりのはず。

ただ cl.exe の32bit/64bitが違っても、出来てくる .exe
は動作するみたいなので、もしかしたらVS2022の環境が完全では無いか壊れているのかもしれません。

以下のような方法を試してみて、それでも解決しないようでしたら、Visual Studio
Installerで修復インストールとかいったんアンインストール/再インストールを試してみた方が良いと思われます。

  * VSCodeからではなく、スタートメニューからVS2022の各コマンドプロンプトを起動して、コンパイルしてみる。(質問の追記では済んでいる？)
  * @radian さんのコメントのように、VSCodeやコマンドプロンプトではなく、Visual Studio のIDE上でプロジェクトを作成し、ビルドしてみる。

それから @774RR
さんコメントのようにセキュリティソフトのチェックが影響しているなら、セキュリティソフトのログに何かしら記録が残りそうです。そちらとかあと加えてイベントログを調べてみるのも手かもしれません。

* * *

可能性は低い/あるいは既にチェック済みかもしれませんが、ユーザー名や作業フォルダまでの途中のパス名にShift-
JISとかIBM拡張の全角文字とか半角文字でも何かの記号とか空白とかが含まれているということはありませんか？

あとはまったく別に、Visual Studio Community
2022をインストールする時に、`ワークロード`のタブでC++系のものを選んだだけでインストールしていませんか？

`個別のコンポーネント`のタブにC++系でも様々な種類とその版数違いのコンポーネントが示されていて、`ワークロード`で選んだだけだと割と多くのものがインストールされません。  
それが影響する可能性は不明なのですが、もしかすると何かあるかもしれないので、C++系の(ゲーム系とか実験段階のものを除く)すべてのコンポーネントをインストールしてみてください。

* * *

上記あたりまでやっても駄目なら、いよいよデータのバックアップを取ってWindows11のクリーンインストールからやり直すパターンでしょうか。


CC BY-SA 4.0
2022-02-24T01:11:05.527
86546
2022-02-24T12:26:31.837
2022-02-24T12:26:31.837
26370
26370
86545
answer


既にコメントが付いていますし、私も実際に同じ手順でプログラムを作成・実行できることを確認しました。そこから言えることは、手順には問題はありません。

あるとすれば、質問者さん固有の環境問題でしかありません。

  * セキュリティソフトはインストールしていない環境
  * Visual Studio 2022 を一旦削除して、再びインストールしてみた

などは考えられる問題の１つであり、どちらも原因ではなかったというのであれば、更に別問題なのでしょう。あらゆる可能性があり、特定できたとして、質問者さんにしか適用されないので、Q&Aの蓄積の観点では微妙だったりします…。

例えば、別のディレクトリで全く同じ操作を行ったら改善しませんか？

* * *

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

とのこと、イベントログにエラーが出ていませんか？
この実行に付随して発生するエラーや、もしくは日常的に何らかのエラーが。特にディスクの読み取りエラーなどが発生していないか気になります。


CC BY-SA 4.0
2022-02-24T13:16:02.060
86560
2022-02-24T13:16:02.060
4236
86545
answer


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

ここまで説明しなかったのですが、当該 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
へのリンクを張り、そちらを介してアクセスしていたためです。混乱された方がいらっしゃったらすみません。


CC BY-SA 4.0
2022-02-25T00:33:36.173
86566
2022-02-25T00:33:36.173
47308
86545
answer