2017-07-11 9 views
0

Code :: Blocks IDEで提供されるMinGWからg ++(バージョン4.9.2)を使用している間、 "hello 、世界!プログラム。私はCode :: Blocksの "inside"からコンパイルされるのとまったく同じコンパイルオプションを使用します(mingw32-g ++ .exe -Wall -g hello.cpp -o hello.exe、とにかく、コードからコピーします) :: Blocks log window)、デバッグ対象の場合は約70KB、リリースの場合は50KBを生成したのとは異なり、これは非常に大きな出力を作り続けます。g ++とMakefileを使用してC++をコンパイルするときに非常に巨大な実行可能ファイルのサイズ

他にみんな同様の問題を抱えていましたか?

[編集]私のプロジェクト(Makefilesの目的のためだけに作成)は、main.cppとfun.cpp(ヘッダなし)の2つのファイルで構成されています。ここではmain.cppにある:

#include<iostream> 

using namespace std; 

void fun(void); 

int main() 
{ 
    cout<<"Hello Make!"<<endl; 
    fun(); 
    return 0; 
} 

、ここfun.cppです:

#include<iostream> 

using namespace std; 

void fun() 
{ 
    cout<<"Hello from The Module!"<<endl; 
} 

そして最後に、これは私のMakefileです:

CC = mingw32-g++ 
CFLAGS = -Wall -Os -lto 


all: main.o fun.o 
    ${CC} -o hello.exe $^ 

relink: 
    mingw32-g++ -o hello.exe hello.o fun.o 

main.o: main.cpp 
    mingw32-g++ ${CFLAGS} -c main.cpp -o [email protected] 

fun.o: fun.cpp 
    mingw32-g++ ${CFLAGS} -c fun.cpp -o [email protected] 

clean: 
    del *.o 

コードの下に、この "プロジェクト" をコンパイルします::ブロック私は次を取得する log

メイクファイルを使用すると、ファイルは1024KB大: (print screen

+0

binutilsから 'strip'ユーティリティを使ってみましたか?それはあなたのツールチェーンに含まれるべきです。大きな実行可能ファイルはlibstdC++に静的にリンクされていますか? –

+1

こんにちは、歓迎、StackOverflowへ。ヘルプページ、特に[ここではどのトピックについて聞かせていただけますか?](http://stackoverflow.com/help/on-topic)と[質問しないでください。」](http://stackoverflow.com/help/dont-ask)。さらに重要なことは、[Stack Overflow question checklist](http://meta.stackexchange.com/q/156810/204922)をお読みください。また、[最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve)についても知りたいことがあります。 – herrbischoff

+0

objまたはexeファイルにあるものを 'objdump'でチェックアウトすることができます。例えば、 'objdump -x hello.exe'を実行すると、exeファイル(各セクションのサイズがわかります)のさまざまなセクションをチェックアウトし、' objdump -d hello.exe'を使って逆アセンブラを実行することができますhello.exe。 – geza

答えて

3

デバッグビルドは通常、最適化されたもの(別名「リリース」)よりも大きくなります。ビルドオプション(-Os)に-O2または-O3を追加してみてください。

また、リリースビルドでデバッグシンボルを必要としない場合は、-gを削除してください(または後でstripコマンドで削除してください)。

また、 Link-Time Optimizationを使用してコンパイルすると、-ltoオプション(-Oオプションのいずれかに加えて)を使用する場合に、(パフォーマンスの向上に加えて)サイズの縮小が生じることがあります。

上記は、大幅なサイズの縮小をもたらすはずです。

オプションの詳細については、gccのマニュアルを参照してください。

+0

g ++のオプションでも、-Oは役に立たなかった(サイズは0.5%減少)。私が実際に理解しようとしているのは、同じオプション、同じ最適化フラグ、同じソースファイルを持つ同じコンパイラがCode :: Blocksの「外側」から使用され、その「内部」で使用された理由が私に異なる結果をもたらす理由です。 – Michal

+0

@Michalあなたは同じ方法で*コンパイル*しているかもしれませんが、同じ方法でリンクしていますか?静的なリンクと動的リンクされたランタイムライブラリ –

+0

私はCode:Blocksコンパイルログウィンドウから次の行をMakefile(_all_ target)にコピーするだけです。mingw32-g ++。exe -o main.o foo.o、リンクが同じ方法になります。どのライブラリがgccによって静的にリンクされているかを知る方法はありますか? – Michal

関連する問題