none
VC++でコマンドラインからのコンパイルについて RRS feed

  • 質問

  • VC++ 2010では、適当なテキストエディタからソースコードを入力し、コマンドプロンプトからコンパイルやリンクなどが行うことも可能ですよね。ですが、それでコンパイルするとexeファイルサイズが非常に大きくなってしまいます。

    hello worldをコンソールに出力するだけのプログラムでも、40KB以上もあります。VC++のIDEでreleaseモードでコンパイルすると、この1/10ぐらいだったかな? そのぐらいの小さなサイズのものが出力されます。

    MSDNのコマンドラインオプションを見て、cl.exeには/Ox /GL、link.exeには/OPT:REF /OPT:ICFなどサイズが小さくなりそうなオプションを追加してコンパイルしても、サイズは小さくなりません。。。動作は変わらないので、不要なデバッグ情報や必要のないlibなどが原因かなとは思っているのですが・・・

    どうやったらコマンドラインから、IDEでコンパイルした時のような小さなexeファイルを作成することが出来ますか? 

    2012年8月9日 4:51

回答

  • コマンドラインオプションの規定では、最適化が行われません。コードによっては、最適化すると劇的に小さくなる場合があります。

    他に大きく影響しそうなところではランタイムのリンクがどうなっているか?ですかね。/MD をつけたら変わるかもしれません。

    そのほかにも、IDEでビルドするときには多数のオプションをつけています。プロパティで、詳細のところを見るとわかりますが、本当にいろいろついてますよ。そのあたりの違い(デフォルトがどれなのかを含む)で、状況が変わっているのだと思います。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    2012年8月9日 7:06

すべての返信

  • >exeファイルサイズが非常に大きくなってしまいます。

    ランタイムライブラリをスタティックリンクしてしまっているのではないでしょうか?

    2012年8月9日 7:02
  • コマンドラインオプションの規定では、最適化が行われません。コードによっては、最適化すると劇的に小さくなる場合があります。

    他に大きく影響しそうなところではランタイムのリンクがどうなっているか?ですかね。/MD をつけたら変わるかもしれません。

    そのほかにも、IDEでビルドするときには多数のオプションをつけています。プロパティで、詳細のところを見るとわかりますが、本当にいろいろついてますよ。そのあたりの違い(デフォルトがどれなのかを含む)で、状況が変わっているのだと思います。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/

    2012年8月9日 7:06
  • 当たり前ですが、IDEのコンパイルオプションと同じものを指定しないと、同じ結果にはなりません。
    VSで*.cppを右クリックして「プロパティ」の「コマンドライン」を参照してください。
    これをコピーしてコマンドラインからそのまま実行すれば、ご希望の結果が得られます。
    2012年8月10日 2:59
  • /MDをcl.exeのオプションとして指定するだけで、小さなサイズのexeファイルを出力してくれますね。

    困っていたので、本当に助かりました。

    2012年8月11日 9:06
  • /MDをcl.exeのオプションとして指定するだけで、小さなサイズのexeファイルを出力してくれますね。

    念のため。

    /MD は Visual C++ のランタイムを別に必要とする形でビルドします。
    これによって、exe のファイルサイズは減っています。(利用している処理を外部 DLL に追いだした形)

    もし、できあがった exe を Visual C++ のランタイムがない環境でも動かしたいなら、サイズが大きくなっても /MT などにする必要があります。

    2012年8月11日 12:36
    モデレータ