基本を再チェック〜gcc〜 |
YAMAMORI Takenori ●yamamori |
次にC++を試してみましょう. 同様に,実行例に沿ってコマンド操作を行なっています.
$ cp hello.c hello++.cc ← (*1) $ make hello++ ← (*2) g++ hello++.cc -o hello++ $ ./hello++ Hello World ! $ CXXFLAGS=-O2; export CXXFLAGS ← (*3) $ rm -f hello++ hello++.o $ make hello++ g++ -O2 hello++.cc -o hello++ $ ./hello++ Hello World ! $ ldd hello++ ← (*4) libstdc++-libc6.1-1.so.2 => /usr/lib/libstdc++-libc6.1-1.so.2 (0x2aac3000) libm.so.6 => /lib/libm.so.6 (0x2ab06000) libc.so.6 => /lib/libc.so.6 (0x2ab23000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x2aaab000) $ rm -f hello++ hello++.o $ make CXX=gcc hello++ ← (*5) gcc -O2 hello++.cc -o hello++ $ ./hello++ Hello World ! $ ldd hello++ ← (*6) libc.so.6 => /lib/libc.so.6 (0x2aac3000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x2aaab000) |
C++のためのサンプルソースとしては, C言語のhello.c がそのまま使えます.ただし,C++のソースとして認識されるように, ファイル名の拡張子を「.cc」に変更する必要があります. ここではわかりやすいようにファイル名も変えて,hello++.ccとしています.(*1)
ここで,C言語の場合と同じように「make hello++」と打ってみましょう. するとg++が起動され,実行バイナリとしてhello++ができたはずです.(*2) (GNU make以外では動作が異なる場合があります) 同様に,最適化オプションも付けてみましょう. C++も「-O2」オプションで最適化することができますが, そのためにはCFLAGSではなくCXXFLAGSの方をセットします.(*3)
実行バイナリのhello++について, lddコマンドを実行して動的リンクされている共有ライブラリを表示してみましょう. すると,C言語の標準ライブラリであるlibcのほか, libstdc++などともリンクされていることがわかります.
ここで試しに,g++ではなくgccでC++のソースをコンパイルしてみましょう. C++用のコンパイラ名の変数はCCではなくCXXになるため, 一時的にCXX=gccと指定してmakeを実行します. するとgccでも問題なくコンパイルできることがわかります.(*5)
ここで再びlddコマンドを実行してみると,g++でコンパイルしたのとは違って libstdc++とはリンクされていないことがわかります.(*6) つまり,このhello++.ccのようにC++のiostreamなどを使っていない場合は, g++コマンドではなくてもgccでもそのままコンパイルでき, むしろその方が余分なライブラリを必要としないという点で合理的なのです. (コラム「gccでC++をコンパイル」参照)