• 締切済み

C++プログラムにおけるexeファイルサイズ

 borland C++でプログラムを記述し、コンパイルするとexeファイルサイズがソースのそれの約100倍に増えます。  これを低減する方法を教示ください?  gcc、g++、vccなど各種コンパイラによって異なるそうですが。

  • bool
  • お礼率25% (1/4)

みんなの回答

  • mcWalker
  • ベストアンサー率69% (27/39)
回答No.2

私もサイズは気になる方なので、ご参考になれば。 bcc5 で printf() だけのソース 85 バイトをコンパイルすると .exe は 52,224 バイトでした。 VD++6 で同じ .exe にすると、Release で 40,960 バイト、 Debug で、172,086 バイトでした。 bcc5 はちょっと大きめ程度ではないかと想像しました。 で、削減の方法は link map を取って見るのが確実と思いますが、 私の bcc5 では、統合開発環境風付きですが、link map を取る指定が分かりませんでした。 (make ファイルに記入できるとは思いますが、やっていません。) #1 の方もお書きですが、link されるルーチンを減らすのがよいと思います。 できれば、stdio.h, string.h は一切使わない。 必要なら、winAPI を使って、自前で標準関数を用意する。モノによっては asm で。 大して得にはなりませんが、global 変数を多用すると生成コードがポインタ load で大きめになることがあります。 逆アセ可能なら、サイズの大きいルーチンを見ると よいと思います。 global 構造体を参照する場合、一旦 local のポインタに 移して使うとかすると、register 命令に変わってサイズが 減ったりします。

  • gatyan
  • ベストアンサー率41% (160/385)
回答No.1

Borland C++ Builder なら、プロジェクトオプションで プログラムタブを開き、リリースを押すのか一番簡単ではないでしょうか? 行番号などのデバッグ情報を付加しない 共有ランタイムを使用する コード最適化は、サイズ優先にする 関数のインライン展開を許可しない 等が考えられますが、必ず組み込まれる初期化ルーチンがあったり、関数1つだけ使っていてもその関数が含まれるライブラリ単位でのリンクになったりするので、あまり効果は無いかも。

関連するQ&A

  • Cコンパイラ(gcc)について

    はじめまして。 C言語のコンパイラについてお尋ねしても宜しいでしょうか。 以下のファイルが存在します。 ・test.c(C言語のソースファイル) ・test.exe(上記ソースをコンパイルしたもの。Windows環境で現在稼動してます) test.cの中身を一部変更し、コンパイルする必要があるのですが、 (恥ずかしながら、コンパイルした人間はもう居ないので) 何のコンパイラを使ったか、判りません。 コンパイルするときに使用したであろうコマンドがあります。 gcc test.c -WALL -03 -o test.exe 察するに、gccというコンパイラを使用したと思い MiniGW (http://yanchde.gozaru.jp/mingw/wingw_start.html) を使用してコンパイルをしてみました。 コンパイルは通るのですが、出来上がるexeファイルのサイズが 非常に小さいです。 (オリジナルのtest.exeは500KB以上ありますが、今回コンパイルで出来たものは40kbほどです) この場合、、オリジナルのtest.exeと今回コンパイルしたexeは 異なる挙動をする可能性はありますでしょうか。。 初歩的な質問で恐縮ですが、どうかご教授頂けると、幸いです。

  • gccでc++プログラムをコンパイルできない

    gccをインストールして使ってみたのですがc++のプログラムをコンパイルすることができません。 gcc test.ccとすると gcc: error trying to exec 'cc1plus': execvp: そのようなファイルやディレクトリはありません というエラーがでます。 ネットで調べたところg++かc++のようにコンパイルすればいいということでしたが、g++やc++とうつとcommand not found とでます。 gcc -versionで調べたところgccのバージョンは gcc (GCC) 4.3.0 20080428 (Red Hat 4.3.0-8) です。 環境はfedora9です。fedora9をインストールしたときにgccがインストールされていなかったので yum install gcc でインストールしたのですが、これがまずかったのでしょうか? 分かっている方からするとトンチンカンな質問かもしれないのですが、どなたかよろしくお願いします。

  • C++言語でのライブラリファイルの作成と使用法

    よろしくお願いします。 C言語において、例えばMinGWのCコンパイラのLibディレクトリには、拡張子が「.a」のライブラリファイルがたくさん存在しています。これらは、arコマンドで ar crv libMine.a 1.o 2.o のように作成されるものだと認識しています。 一方、C++言語において、例えばBorlandのC++コンパイラのLibディレクトリには、拡張子が「.lib」というライブラリファイルがたくさん存在します。 これらのファイブラリファイルは、C言語のaファイルと同じ役割をする考えてよいのでしょうか? また、C++において自作のライブラリファイル(libファイル)を作成するにはどうすればよいのでしょうか? 次に、C++における自作ライブラリの使用法についてですが、Cではコンパイル時に gcc -o 1.exe 1.c libMine.a のようにして、自作のライブラリファイルを使うことができますが C++のコンパイルコマンド、例えばbcc32コマンドを使ってコンパイルする時に、 自分が作成したlibファイルを使うにはどのようにすればよいのでしょうか? 最後に、Borland C++コンパイラをインストールするときに、Binディレクトリにあるbcc.cfgファイルに -L"c:\Borland\Bcc55\lib" と記述したのですが、これは、 c:\Borland\Bcc55\libにあるlibファイルをコンパイル時に自動的に読み込むということなのでしょうか?

  • LinuxでC++ファイルをコンパイルできない

    今までWindowsのPCで研究用プログラムを書いていたのですが、 多数のプログラムを同時に動かせるLinuxの大型サーバーが導入されたので、 これを活用したいと考えています。 これまでコンパイラはBorland C++ Compiler5.5を使っていたのですが、 WinSCPとPuTTYを使ってソースコードをサーバーにコピーしてg++でコンパイルすると、 大量のエラーが出てしまいました。 QR分解などを用いて複素数の計算・推定をして統計結果を表示するプログラムなのですが、 複素数の変数を定義する部分でのエラーが多数を占めているようです。 Borland用に書いたプログラムをLinuxで動かすにはどうすればいいのでしょうか?

  • C言語でプロセスを処理するプログラムを考えています。

    C言語でプロセスを処理するプログラムを考えています。 popenを使ってプロセスを起動しようとしたですが、popenが未定義の関数とエラーが出てコンパイルできません。 ヘッダにstdio.hはおいてあります。 コンパイラはborlandを使用しています。 よろしくお願いします。

  • gccコンパイラー

    今、gccでコンパイルするc言語のコンパイラーを探しています。 フリーでダウンロードできるいいコンパイラーはないでしょうか。 お勧めなどがありましたら教えてほしいです。 あと、C言語ではgccやbcc等のコンパイラーで プログラムソースの書き方容が変わったりするものなのでしょうか? 一応、ボーランド?のコンパイラーは持ってます。 ただ、今度OJTでUNIX環境のc言語開発の現場に行く事になり gccでコンパイルするもので勉強しとくようにいわれています。 宜しくお願いします。

  • 【エラー】Cpadで初めてコンパイル

    Cpad for Borlandで以下のようなソースを書きコンパイルをしましたが、失敗し、行き詰っております。 当方、初プログラミングに挑戦しております。 <環境> OS:XP(HOME) コンパイラ:Borland C++ Compiler エディタ:Cpad for Borland <動作状況> ソース: #include <stdio.h> int main ( void ) { printf(mori); return 0; } エラー情報: 「コンパイルに失敗しました。 ファイル"ファイル"D:\source\test1.exe"は存在しません」 参考情報(参考にならないかもしれませんが…): ・コンパイラはDドライブにインストールしております。 ・コンパイラのパスはD:\borland\bcc55\Bin\bcc32.exeです。 以上、よろしくお願いいたします。

  • CとJavaはどのくらいスピードが違うの?

    BorlandのJBuilderなど、Javaもネイティブコードコンパイラがありますよね。質問ですが、 (1) UNIXで動くJavaのネイティブコードコンパイラで優秀なものはあるのでしょうか。 (2) C言語でコンパイルしたプログラムとJavaでネイティブコードコンパイルしたプログラムは、どのくらい速度に差があるのでしょうか? たとえば、Visual Basicも最近のバージョンはネイティブコードコンパイルができますが、C言語で作った同じ論理構造のプログラムに比べて、やはり、かなり実行速度が劣ります。

  • Cygwinに付属しているg++コマンドについて

    こんにちは。 Cygwinに付属しているC++コンパイルコマンドのg++について、いくつか質問させて下さい。 ・g++はC++だけでなく、Cのソースファイルもコンパイルできるので、Cのプログラムを開発するときは、gccは必要なく、g++だけでよいと思うのですが、どうしてgccが存在するのでしょうか? g++だけで十分ですよね? ・bashなどのコマンドライン上で g++ -print-libgcc-file-name と入力すると、コンパイラのコンパニオンライブラリ名を表示されるようなのですが、 コンパイラライブラリって何なのでしょうか? ちなみに自分の環境では、 /bin/../lib/gcc/i686-pc-cygwin/4.3.4/libgcc.a と表示されました。 ・-timeオプションを付けてg++でCソースファイルをビルドすると、以下のようになりました。 $ g++ -time "test.c" # cc1plus 0.03 0.01 # as 0.00 0.01 # collect2 0.00 0.08 1つめの時間と、2つめの時間は、それぞれ何を意味するのでしょうか? ・g++で使えるコマンドラインオプションとgccで使えるコマンドラインオプションは、 一緒のような気がするのですが、g++でしか使えないコマンドラインオプションってありますか? 以上です。 よろしくお願い致します。

  • Visual C++では問題があるのにgccではうまくいく理由

    Visual C++(2005)付属のコマンドラインのコンパイラを使って(cl)コンパイルしたプログラムでは、出力したい値を格納するdouble型の変数の値が、-1.#IND00となってしまうのに対して、 まったく同じソースをgccでコンパイルした場合には、普通の数値が正常に出力され、その値は事前の予想どおりの傾向を持っていることから、まちがってはいないようです。 clではうまくいかず、gccではうまくいくのはなぜなのでしょうか。 関係があるかどうかわかりませんが、値の算出の過程でrand()を使っています。